Python中字符串的处理技巧分享
一、如何拆分含有多种分隔符的字符串?
实际案例
我们要把某个字符串依据分隔符号拆分不同的字符段,该字符串包含多种不同的分隔符,例如:
s = 'asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd'
其中<,>,<;>,<|>,<\t>
都是分隔符,如何处理?
解决方案
连续使用split()
方法,每次处理一种分隔符
# 使用Python2 def mySplit(s,ds): res = [s] for d in ds: t = [] map(lambda x: t.extend(x.split(d)), res) res = t return [x for x in res if x] s = 'asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd' result = mySplit(s, ';,|\t') print(result)
C:\Users\Administrator>C:\Python\Python27\python.exe E:\python-intensive-training\s2.py ['asd', 'aad', 'dasd', 'dasd', 'sdasd', 'asd', 'Adas', 'sdasd', 'Asdasd', 'd', 'asd']
使用正则表达式的re.split()
方法,一次性拆分字符串
> import re > re.split('[,;\t|]+','asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd') ['asd', 'aad', 'dasd', 'dasd', 'sdasd', 'asd', 'Adas', 'sdasd', 'Asdasd', 'd', 'asd']
二、如何判断字符串a是否以字符串b开头或结尾?
实际案例
如某目录有如下文件:
quicksort.c graph.py heap.java install.sh stack.cpp ......
现在需要给.sh
和.py
结尾的文件夹上可执行权限
解决方案
使用字符串的startswith()
和endswith()
方法
> import os, stat > os.listdir('./') ['heap.java', 'quicksort.c', 'stack.cpp', 'install.sh', 'graph.py'] > [name for name in os.listdir('./') if name.endswith(('.sh','.py'))] ['install.sh', 'graph.py'] > os.chmod('install.sh', os.stat('install.sh').st_mode | stat.S_IXUSR)
[root@iZ28i253je0Z t]# ls -l install.sh -rwxr--r-- 1 root root 0 Sep 15 18:13 install.sh
三、如何调整字符串中文本的格式?
实际案例
某软件的日志文件,其中日期格式为yyy-mm-dd
:
2016-09-15 18:27:26 statu unpacked python3-pip:all 2016-09-15 19:27:26 statu half-configured python3-pip:all 2016-09-15 20:27:26 statu installd python3-pip:all 2016-09-15 21:27:26 configure asdasdasdas:all python3-pip:all
需要把其中日期改为美国日期的格式mm/dd/yyy
, 2016-09-15 --> 09/15/2016
,要如何处理?
解决方案
使用正则表达式re.sub()
方法做字符串替换
利用正则表达式的捕获组,捕获每个部分内容,在替换字符串中各个捕获组的顺序。
> log = '2016-09-15 18:27:26 statu unpacked python3-pip:all' > import re # 按顺序 > re.sub('(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1' , log) '09/15/2016 18:27:26 statu unpacked python3-pip:all' # 使用正则表达式的分组 > re.sub('("color: #ff0000">四、如何将多个小字符串拼接成一个大的字符串?实际案例
在设计某网络程序时,我们自定义了一个基于UDP的网络协议,按照固定次序向服务器传递一系列参数:
hwDetect: "<0112>" gxDepthBits: "<32>" gxResolution: "<1024x768>" gxRefresh: "<60>" fullAlpha: "<1>" lodDist: "<100.0>" DistCull: "<500.0>"在程序中我们将各个参数按次序收集到列表中:
["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]最终我们要把各个参数拼接成一个数据包进行发送:
"<0112><32><1024x768><60><1><100.0><500.0>"解决方案
迭代列表,连续使用'+'操作依次拼接每一个字符串
> for n in ["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]: ... result += n ... > result '<0112><32><1024x768><60><1><100.0><500.0>'使用
str.join()
方法,更加快速的拼接列表中所有字符串
> result = ''.join(["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]) > result '<0112><32><1024x768><60><1><100.0><500.0>'如果列表中有数字,可以使用生成器进行转换:
> hello = [222,'sd',232,'2e',0.2] > ''.join(str(x) for x in hello) '222sd2322e0.2'五、如何对字符串进行左, 右, 居中对齐?
实际案例
某个字典中存储了一系列属性值:
{ 'ip':'127.0.0.1', 'blog': 'www.anshengme.com', 'title': 'Hello world', 'port': '80' }在程序中,我们想以以下格式将其内容输出,如何处理?
ip : 127.0.0.1 blog : www.anshengme.com title : Hello world port : 80解决方案
使用字符串的
str.ljust()
,str.rjust,str.cente()
进行左右居中对齐
> info = {'ip':'127.0.0.1','blog': 'www.anshengme.com','title': 'Hello world','port': '80'} # 获取字典中的keys最大长度 > max(map(len, info.keys())) 5 > w = max(map(len, info.keys())) > for k in info: ... print(k.ljust(w), ':',info[k]) ... # 获取到的结果 port : 80 blog : www.anshengme.com ip : 127.0.0.1 title : Hello world使用
format()
方法,传递类似'<20','>20','^20'参数完成同样任务
> for k in info: ... print(format(k,'^'+str(w)), ':',info[k]) ... port : 80 blog : www.anshengme.com ip : 127.0.0.1 title : Hello world六、如何去掉字符串中不需要的字符?
实际案例
过滤掉用户输入卡后多余的空白字符: anshengm.com@gmail.com
过滤某windows下编辑文本中的'\r': hello word\r\n
去掉文本中的unicode组合符号(音调): ‘ni"htmlcode">
> email = ' anshengm.com@gmail.com ' > email.strip() 'anshengm.com@gmail.com' > email.lstrip() 'anshengm.com@gmail.com ' > email.rstrip() ' anshengm.com@gmail.com' >删除某个固定位置的字符,可以使用切片+拼接的方法
> s[:3] + s[4:] 'abc123'字符串的
replace()
方法或正则表达式re.sub()
删除任意位置字符
> s = '\tabc\t123\txyz' > s.replace('\t', '') 'abc123xyz'使用
re.sub()
删除多个> import re > re.sub('[\t\r]','', string) 'abc123xyzopq'字符串
translate()
方法,可以同时删除多种不同字符
> import string > s = 'abc123xyz' > s.translate(string.maketrans('abcxyz','xyzabc')) 'xyz123abc'> s = '\rasd\t23\bAds' > s.translate(None, '\r\t\b') 'asd23Ads'# python2.7 > i = u'ni"color: #ff0000">总结
以上就是为大家整理的Python中字符串的处理技巧,文中通过案例、解决方案以及实例来演示如何解决,对大家学习或者使用python具有一定的参考借鉴价值。有需要的可以参考借鉴。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python字符串操作技巧汇总》、《Python编码操作技巧总结》、《Python图片操作技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
下一篇:Python中对象迭代与反迭代的技巧总结
人们对于笔记本电脑有一个固有印象:要么轻薄但性能一般,要么性能强劲但笨重臃肿。然而,今年荣耀新推出的MagicBook Pro 16刷新了人们的认知——发布会上,荣耀宣布猎人游戏本正式回归,称其继承了荣耀 HUNTER 基因,并自信地为其打出“轻薄本,更是游戏本”的口号。
众所周知,寻求轻薄本的用户普遍更看重便携性、外观造型、静谧性和打字办公等用机体验,而寻求游戏本的用户则普遍更看重硬件配置、性能释放等硬核指标。把两个看似难以相干的产品融合到一起,我们不禁对它产生了强烈的好奇:作为代表荣耀猎人游戏本的跨界新物种,它究竟做了哪些平衡以兼顾不同人群的各类需求呢?