python 实用编程技巧 —— 复杂场景下字符串处理相关问题与解决技巧
如何拆分含有多种分隔符的字符串
实际案例:
- 我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如: s=’ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz’,其中<,>, <;>, <|>, <\t>都是分隔符号,如何处理?
解决方案:
- 1.连续使用str.split(),每一次处理一种分隔符号;
- 2.使用正则表达式的re.split(),一次性拆分字符串
map 函数的使用 (对指定的序列进行映射)
for z in map(lambda x: x.split(';'), ["ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz"]): print(z)
连续使用str.split
s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz" def mySplit(s, ds): res = [s] for i in ds: t = [] for z in map(lambda x: x.split(i), res): t.extend(z) res = t return [x for x in res if x] print(mySplit(s, ",;|\t"))
使用正则表达式的re.split(),一次性拆分字符串
import re s="ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz" print(re.split(r'[,;|\t]+',s))
如何判断字符串a是否以字符串b开头或结尾
实际案例:
- 某文件系统中目录下有一系列文件,a.c,b.sh,d.py,e.java... 编写程序给其中所以的.sh文件和.py文件加上用户可执行权限
解决方案:
- 使用字符串的str.startwith()和str.endswith()方法, 注意:多个匹配时参数使用元组
如何调整字符串中文本的格式
案例:
- 把日期格式 'yyyy-mm-dd'改成'mm/dd/yyyy'
解决方案:
- 使用正则表达式re.sub()方法做字符串替换,利用正则表达式的捕获组,捕获每个部分内容,在替换字符串中调整各个捕获组的顺序
import re log = "2016-05-21 10:39:26 statys unpacked python3-pip:all " \ "2016-05-23 10:49:26 status half-configured python3" res = re.sub('(?P<d>\d{4})-(?P<m>\d{2})-(?P<y>\d{2})', r'\g<m>/\g<d>/\g<y>', log) print(res)
如何将多个小字符串拼接成一个大的字符串
解决方案
- 迭代列表,连续使用'+'操作依次拼接每一个字符串
- 使用str.join()方法,更加快速的拼接列表中的所有字符串
l = ["<0112>", "<32>", "<1024x768>", "<60>", "<1>", "<100.0>", "<500.0>"] print(''.join(l))
如何对字符串进行左, 右, 居中对齐
案例:
- { "a":100, "as":0.01, "wer":500.0, "cc":12 } 处理成: "a" :100, "as" :0.01, "wer":500.0, "cc" :12
解决方案:
- 使用字符串的str.ljust(),str.rjust(),str.center()进行左右中对齐
- 使用format()方法,传递类似'<20','>20','^20'参数完成同样任务
s = 'abc' print(s.ljust(20)) print(s.ljust(20,'=')) print(s.rjust(20)) print(s.center(20)) print(format(s,'<20')) print(format(s,'>20')) print(format(s,'^20'))
实际案例
d = { "a":100, "as":0.01, "wer":500.0, "cc":12 } # 通过map找出key的长度 print(list(map(len,d.keys()))) w = max(list(map(len, d.keys()))) for k in d: print(k.ljust(w),':',d[k])
如何去掉字符串中不需要的字符
案例:
- 1.过滤掉用户输入中前后多余的空白字符:' hello@qq.com '
- 2.过滤windows下编辑文本中的'\r':'hello world\r\n'
- 3.去掉文本中的unicode符号"āáǎà ōóǒò ēéěè īíǐì"
方案:
- 1.字符串strip(),lstrip(),rstip()去掉字符串两端字符
- 2.删除单个固定位置的字符,可以使用切片+拼接的方式
- 3.字符串的replace()方法或正则表达式re.sub()删除任意位置字符
- 4.字符串translate()方法,可以同时删除多种不同字符
去掉空白字符
s = ' abc 123 ' # 去掉两边的空白字符 print(s.strip()) # 去掉左边的字符 print(s.lstrip()) # 去掉右边的字符 print(s.rstrip())
删除字符
s = '+++abc---' # 删除字符串中的多个字符 print(s.strip('+-')) s = 'abc:123' # 删除一个区间的字符 print(s[:3] + s[4:])
替换字符
s = '\tabc\t123\txyz' # 替换单个字符 print(s.replace('\t','')) # 替换多个不同字符 import re s = '\tabc\t123\txyz\ropt\r' print(re.sub('[\t\r]','',s))
字符串值相互替换
s = 'abc123def456xyz' a = s.maketrans('abcxyz','xyzabc') print(s.translate(a))
去除 unicode 中的特殊字符
import sys import unicodedata s = 'āáǎà ōóǒò ēéěè īíǐì' remap = { # ord返回ascii值 ord('\t'): '', ord('\f'): '', ord('\r'): None } # 去除\t, \f, \r a = s.translate(remap) ''' 通过使用dict.fromkeys() 方法构造一个字典,每个Unicode 和音符作为键,对于的值全部为None 然后使用unicodedata.normalize() 将原始输入标准化为分解形式字符 sys.maxunicode : 给出最大Unicode代码点的值的整数,即1114111(十六进制的0x10FFFF)。 unicodedata.combining:将分配给字符chr的规范组合类作为整数返回。 如果未定义组合类,则返回0。 ''' cmb_chrs = dict.fromkeys(c for c in range(sys.maxunicode) if unicodedata.combining(chr(c))) #此部分建议拆分开来理解 b = unicodedata.normalize('NFD', a) ''' 调用translate 函数删除所有重音符 ''' print(b.translate(cmb_chrs))