Python字符串处理实例详解
Python字符串处理实例详解一、拆分含有多种分隔符的字符串1.如何拆分含有多种分隔符的字符串问题 我们要把某个字符串依据分隔符号拆分不同的字段该字符串包含多种不同的分隔符例如1sab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz其中;,|,\t 都是分隔符号如何处理方法一 连续使用str.split()方法每次处理一种分隔符号1234567891011121314sab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyzdefmySplit(s,ds):res[s]fordinds:t[]map(lambdax: t.extend(x.split(d)), res)restreturnresprintmySplit(s,;|,\t)输出[ab,cd,efg,hi,jkl,mn,opq,rst,uvw,xyz]方法二 使用正则表达式的re.split()方法一次性拆分字符串12345678importresab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyzprintre.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()方法 (注意多个匹配时参数使用元组)12345678910111213141516171819202122232425In [1]:importos# 列出当前目录以.sh和以.py结尾的文件In [2]: [namefornameinos.listdir(.)ifname.endswith((.py,.sh))]Out[2]: [b.sh,a.py]In [3]:importstat# 查看 a.py 文件权限In [4]: os.stat(a.py).st_modeOut[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]: lltotal0-rwxrw-r--1yangyang05月914:48a.py*-rw-rw-r--1yangyang05月914:48b.sh-rw-rw-r--1yangyang05月914:48quicksort.c-rw-rw-r--1yangyang05月914:48stack.cpp2.如何对字符串中文本的格式进行调整问题 某软件的log文件其中日期格式为“yyyy-mm-dd”:123456782017-05-0809:12:48status half-configured passwd:amd641:4.2-3.1ubuntu5.22017-05-0809:12:48status installed passwd:amd641:4.2-3.1ubuntu5.22017-05-0809:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.22017-05-0809:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.22017-05-0809:12:48status half-configured passwd:amd641:4.2-3.1ubuntu5.22017-05-0809:12:48status installed passwd:amd641:4.2-3.1ubuntu5.22017-05-0809:12:48startup packages configure09:12:48startup packages configure我们想把其中日期改为美国日期的格式mm/dd/yyyy,2017-05-08 05/08/2017 ,应如何处理解决方案使用正则表达式re.sub()方法做字符串替换利用正则表达式的捕获组捕获每个部分内容在字符串中调整各个组的捕获顺序。1234567891011121314151617181920In [1]:importreIn [2]: logopen(/var/log/dpkg.log).read()# (\d{4}) 匹配到4个数字为一个捕获组其顺序为1。故后面替换用\1放到最后r是为了防止字符串被转义In [3]:printre.sub((\d{4})-(\d{2})-(\d{2}),r\2/\3/\1, log)05/08/201709:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.205/08/201709:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.205/08/201709:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.205/08/201709:12:48status half-configured passwd:amd641:4.2-3.1ubuntu5.205/08/201709:12:48status installed passwd:amd641:4.2-3.1ubuntu5.205/08/201709:12:48startup packages configure# 也可以为每个捕获组起个名称而不使用默认顺序来处理In [5]:printre.sub((?Pyear\d{4})-(?Pmonth\d{2})-(?Pday\d{2}),r\gmonth/\gday/\gyear, log)05/08/201709:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.205/08/201709:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.205/08/201709:12:48status unpacked passwd:amd641:4.2-3.1ubuntu5.205/08/201709:12:48status half-configured passwd:amd641:4.2-3.1ubuntu5.205/08/201709:12:48status installed passwd:amd641:4.2-3.1ubuntu5.205/08/201709:12:48startup packages configure三、字符串拼接1.如何将多个小字符串拼接成一个大的字符串问题在程序中我们将各个参数按次序收集到列表中 [0112, 32,1024x768,60 ],要把各个参数拼接成数据报进行发送0112321024x76860解决方案方法一迭代列表连续使用“”操作依次拼接每一个字符串123456789101112131415In [1]: pl[0112,32,1024x768,60]In [2]: s# 这种方法会产生许多临时结果会造成资源的浪费In [3]:forpinpl:...: ssp...:prints...:01120112320112321024x7680112321024x76860In [4]: sOut[4]:0112321024x76860方法二使用str.join()方法更加快速的拼接列表中所有字符串12In [5]: .join(pl)Out[5]:0112321024x76860有个列表l [abc,123,45,xyz],如何让123和45以字符串的方式拼接123456789In [6]: l[abc,123,45,xyz]# 使用生成器表达式开销比列表表达式小In [7]: (str(x)forxinl)...:Out[7]: generatorobjectgenexpr at0x7fe3cadef550In [8]: .join(str(x)forxinl)Out[8]:abc12345xyz四、字符串居中对齐1.如何对字符串进行左、右、居中对齐问题 某个字典存储了一系列属性值12345{loDist:100.0,smartCull:0.04,farclip:477}在程序中想以工整的格式进行输出如何处理解决方案方法一 使用字符串的str.ljust(),str.rjust(),str.center()进行,右,居中对齐方法二 使用format方法传递类似20,20,^20参数完成同样任务12345678910111213141516171819202122232425262728293031In [1]: sabcIn [2]: s.ljust(20)Out[2]:abc In [3]: s.ljust(20,)Out[3]:abcIn [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]: wmax(map(len,d.keys()))In [9]:forkind:...:printk.ljust(w),:,d[k]...:loDist :100.0smartCull :0.04farclip :4772.去掉不需要的字符串问题1.过滤掉用户输入中前后多余的空白字符 nickgmail.com 2.过滤某windows下编辑文本中的\r: hello world\r\n3.去掉文本中的unicode组合符号(音调):uzǒu解决方案方法一 字符串strip(),lstrip(),rstrip()方法去掉字符串两端字符方法二删除单个固定位置的字符可以使用切片拼接的方式方法三字符串的replace方法或正则表达式re.sub()方法删除任意位置字符方法四字符串translate()方法,可以同时删除多种不同字符123456789101112131415161718192021222324252627282930313233343536373839404142In [1]: s abc 123 In [2]: s.strip()Out[2]:abc 123In [3]: s.lstrip()Out[3]:abc 123 In [4]: s-----abIn [5]: s.strip(-)Out[5]:abIn [6]: sabc:123In [7]: s[:3]s[4:]Out[7]:abc123In [8]: s\tabc\t123\txyz# 去除\tIn [9]: s.replace(\t,)Out[9]:abc123xyzIn [10]: s\tabc\t123\txyz\ropq\rIn [11]:importre# 去除\t\rIn [12]: re.sub([\t\r],,s)Out[12]:abc123xyzopqIn [13]: sabc\refg\n\2342\t# 去除\t\r\nIn [14]: s.translate(None,\t\r\n)Out[14]:abcefg\x9c2In [15]: uuzǒuIn [16]: uOut[16]: uz\u01d2uIn [17]:printu.translate({0x01d2:None})zu复制讲解感谢阅读希望能帮助到大家