返回顶部

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))

 

  

  

 

posted @ 2019-08-25 17:45  Crazymagic  阅读(308)  评论(0编辑  收藏  举报