一、拆分含有多种分隔符的字符串
1.如何拆分含有多种分隔符的字符串
问题: 我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如:
1
|
s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz"
|
其中;,|,\t 都是分隔符号,如何处理?
方法一: 连续使用str.split()方法,每次处理一种分隔符号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz"
def mySplit(s,ds):
res = [s]
for d in ds:
t = []
map ( lambda x: t.extend(x.split(d)), res)
res = t
return res
print mySplit(s, ';|,\t' )
输出:
[ 'ab' , 'cd' , 'efg' , 'hi' , 'jkl' , 'mn' , 'opq' , 'rst' , 'uvw' , 'xyz' ]
|
方法二: 使用正则表达式的re.split()方法,一次性拆分字符串
1
2
3
4
5
6
7
8
|
import re
s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz"
print re.split(r '[;|,\t]+' ,s)
输出:
[ 'ab' , 'cd' , 'efg' , 'hi' , 'jkl' , 'mn' , 'opq' , 'rst' , 'uvw' , 'xyz' ]
|
二、调整字符串中文本格式
1. 如何判断字符串a是否以字符串b开头或结尾
问题:某文件系统目录下有一系列文件:a.py,quicksort.c,stack.cpp,b.sh , 编写程序给其中所有.sh文件和.py文件加上用户可执行权限?
解决方案: 使用字符串中的str.startswith()和end.startswith()方法 (注意:多个匹配时参数使用元组)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
In [ 1 ]: import os
# 列出当前目录以.sh和以.py结尾的文件
In [ 2 ]: [name for name in os.listdir( '.' ) if name.endswith(( '.py' , '.sh' ))]
Out[ 2 ]: [ 'b.sh' , 'a.py' ]
In [ 3 ]: import stat
# 查看 a.py 文件权限
In [ 4 ]: os.stat( 'a.py' ).st_mode
Out[ 4 ]: 33204
# 把文件权限转换成8进制,即为平常看到的权限
In [ 5 ]: oct (os.stat( 'a.py' ).st_mode)
Out[ 5 ]: '0100664'
# 更改文件权限,添加一个可执行权限
In [ 6 ]: os.chmod( 'a.py' ,os.stat( 'a.py' ).st_mode | stat.S_IXUSR)
In [ 7 ]: ll
total 0
- rwxrw - r - - 1 yangyang 0 5 月 9 14 : 48 a.py *
- rw - rw - r - - 1 yangyang 0 5 月 9 14 : 48 b.sh
- rw - rw - r - - 1 yangyang 0 5 月 9 14 : 48 quicksort.c
- rw - rw - r - - 1 yangyang 0 5 月 9 14 : 48 stack.cpp
|
2.如何对字符串中文本的格式进行调整
问题: 某软件的log文件,其中日期格式为“yyyy-mm-dd”:
1
2
3
4
5
6
7
8
|
2017 - 05 - 08 09 : 12 : 48 status half - configured passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
2017 - 05 - 08 09 : 12 : 48 status installed passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
2017 - 05 - 08 09 : 12 : 48 status unpacked passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
2017 - 05 - 08 09 : 12 : 48 status unpacked passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
2017 - 05 - 08 09 : 12 : 48 status half - configured passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
2017 - 05 - 08 09 : 12 : 48 status installed passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
2017 - 05 - 08 09 : 12 : 48 startup packages configure
09 : 12 : 48 startup packages configure
|
我们想把其中日期改为美国日期的格式"mm/dd/yyyy",2017-05-08 ==> 05/08/2017 ,应如何处理?
解决方案:使用正则表达式re.sub()方法做字符串替换,利用正则表达式的捕获组捕获每个部分内容,在字符串中调整各个组的捕获顺序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
In [ 1 ]: import re
In [ 2 ]: log = open ( '/var/log/dpkg.log' ).read()
# (\d{4}) 匹配到4个数字为一个捕获组,其顺序为1。故后面替换用\1放到最后,r是为了防止字符串被转义
In [ 3 ]: print re.sub( '(\d{4})-(\d{2})-(\d{2})' ,r '\2/\3/\1' , log)
05 / 08 / 2017 09 : 12 : 48 status unpacked passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
05 / 08 / 2017 09 : 12 : 48 status unpacked passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
05 / 08 / 2017 09 : 12 : 48 status unpacked passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
05 / 08 / 2017 09 : 12 : 48 status half - configured passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
05 / 08 / 2017 09 : 12 : 48 status installed passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
05 / 08 / 2017 09 : 12 : 48 startup packages configure
# 也可以为每个捕获组起个名称,而不使用默认顺序来处理
In [ 5 ]: print re.sub( '(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})' ,r '\g<month>/\g<day>/\g<year>' , log)
05 / 08 / 2017 09 : 12 : 48 status unpacked passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
05 / 08 / 2017 09 : 12 : 48 status unpacked passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
05 / 08 / 2017 09 : 12 : 48 status unpacked passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
05 / 08 / 2017 09 : 12 : 48 status half - configured passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
05 / 08 / 2017 09 : 12 : 48 status installed passwd:amd64 1 : 4.2 - 3.1ubuntu5 . 2
05 / 08 / 2017 09 : 12 : 48 startup packages configure
|
三、字符串拼接
1.如何将多个小字符串拼接成一个大的字符串
问题:在程序中我们将各个参数按次序收集到列表中: ["<0112>", "<32>","<1024x768>","<60>" ],要把各个参数拼接成数据报进行发送"<0112><32><1024x768><60>"
解决方案:
方法一:迭代列表,连续使用“+”操作依次拼接每一个字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
In [ 1 ]: pl = [ "<0112>" , "<32>" , "<1024x768>" , "<60>" ]
In [ 2 ]: s = ''
# 这种方法会产生许多临时结果,会造成资源的浪费
In [ 3 ]: for p in pl:
...: s = s + p
...: print s
...:
< 0112 >
< 0112 >< 32 >
< 0112 >< 32 >< 1024x768 >
< 0112 >< 32 >< 1024x768 >< 60 >
In [ 4 ]: s
Out[ 4 ]: '<0112><32><1024x768><60>'
|
方法二:使用str.join()方法,更加快速的拼接列表中所有字符串
1
2
|
In [ 5 ]: ''.join(pl)
Out[ 5 ]: '<0112><32><1024x768><60>'
|
有个列表l = ['abc',123,45,'xyz'],如何让123和45以字符串的方式拼接
1
2
3
4
5
6
7
8
9
|
In [ 6 ]: l = [ 'abc' , 123 , 45 , 'xyz' ]
# 使用生成器表达式,开销比列表表达式小
In [ 7 ]: ( str (x) for x in l)
...:
Out[ 7 ]: <generator object <genexpr> at 0x7fe3cadef550 >
In [ 8 ]: ''.join( str (x) for x in l)
Out[ 8 ]: 'abc12345xyz'
|
四、字符串居中对齐
1.如何对字符串进行左、右、居中对齐
问题: 某个字典存储了一系列属性值
1
2
3
4
5
|
{
"loDist" : 100.0 ,
"smartCull" : 0.04 ,
"farclip" : 477
}
|
在程序中想以工整的格式进行输出,如何处理?
解决方案:
方法一: 使用字符串的str.ljust(),str.rjust(),str.center()进行,右,居中对齐
方法二: 使用format方法,传递类似'<20','>20','^20'参数完成同样任务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
In [ 1 ]: s = 'abc'
In [ 2 ]: s.ljust( 20 )
Out[ 2 ]: 'abc '
In [ 3 ]: s.ljust( 20 , '=' )
Out[ 3 ]: 'abc================='
In [ 4 ]: s.center( 20 )
Out[ 4 ]: ' abc '
In [ 5 ]: format (s, '<20' )
Out[ 5 ]: 'abc '
In [ 6 ]: d = {
...: "loDist" : 100.0 ,
...: "smartCull" : 0.04 ,
...: "farclip" : 477
...: }
In [ 7 ]: d.keys()
Out[ 7 ]: [ 'loDist' , 'smartCull' , 'farclip' ]
In [ 8 ]: w = max ( map ( len ,d.keys()))
In [ 9 ]: for k in d:
...: print k.ljust(w), ':' ,d[k]
...:
loDist : 100.0
smartCull : 0.04
farclip : 477
|
2.去掉不需要的字符串
问题:
1.过滤掉用户输入中前后多余的空白字符: ' nick@gmail.com '
2.过滤某windows下编辑文本中的'\r': 'hello world\r\n'
3.去掉文本中的unicode组合符号(音调):u'zǒu'
解决方案:
方法一: 字符串strip(),lstrip(),rstrip()方法去掉字符串两端字符
方法二:删除单个固定位置的字符,可以使用切片+拼接的方式
方法三:字符串的replace方法或正则表达式re.sub()方法删除任意位置字符
方法四:字符串translate()方法,可以同时删除多种不同字符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
In [ 1 ]: s = ' abc 123 '
In [ 2 ]: s.strip()
Out[ 2 ]: 'abc 123'
In [ 3 ]: s.lstrip()
Out[ 3 ]: 'abc 123 '
In [ 4 ]: s = '-----ab+++++'
In [ 5 ]: s.strip( '-+' )
Out[ 5 ]: 'ab'
In [ 6 ]: s = 'abc:123'
In [ 7 ]: s[: 3 ] + s[ 4 :]
Out[ 7 ]: 'abc123'
In [ 8 ]: s = '\tabc\t123\txyz'
# 去除\t
In [ 9 ]: s.replace( '\t' ,'')
Out[ 9 ]: 'abc123xyz'
In [ 10 ]: s = '\tabc\t123\txyz\ropq\r'
In [ 11 ]: import re
# 去除\t\r
In [ 12 ]: re.sub( '[\t\r]' ,'',s)
Out[ 12 ]: 'abc123xyzopq'
In [ 13 ]: s = 'abc\refg\n\2342\t'
# 去除\t\r\n
In [ 14 ]: s.translate( None , '\t\r\n' )
Out[ 14 ]: 'abcefg\x9c2'
In [ 15 ]: u = u 'zǒu'
In [ 16 ]: u
Out[ 16 ]: u 'z\u01d2u'
In [ 17 ]: print u.translate({ 0x01d2 : None })
zu
|
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:https://my.oschina.net/zhangyangyang/blog/895964