python中字符串和文本处理(很详细)

        1.工作中经常会遇到各种各样的文本操作,来满足开发中的各种对数据的要求,例如拆分字符串,搜索,替换,词法分析以及解析。
        2.有时有这样的需求,我们需要将字符串拆分为不同的字段,但是分割符在整个字符串中并不一致,字符串对象的split()方法只能处理非常简单的情况,而且不支持多个分割符,对分割符周围可能存在的空格也无能为力,当需要一些更灵活的功能时,可以使用re.splite()方法:
import re
str = 'asd hfg; dfx,  excvg,     fgfr'
s = re.split(r'[;,\s]\s*',str)
print(s)
结果:
['asd', 'hfg', 'dfx', 'excvg', 'fgfr']
        3.有时有这样的需求,检查文件的扩展名,URL协议类型等,有一种简单的方法可以使用str.startswith()和str.endswith()方法就可以了。示例如下:
filename = 'name.txt'
print(filename.endswith('.txt'))
结果:
True



import os
f = os.listdir('.')
l1 = [name for name in f if name.endswith('.py')]
print(l1)
结果:
['run.py', '66.py', 'test.py', 'base_data.py']
        4.有时要对字符串中的文本做查找和替换,可以使用str.replace()方法即可。
str = 'i like you '
s2 = str.replace('like', 'love')
print(s2)
结果:
ℹ love you 
        5. 针对更复杂的模式,可以使用re模块中的sub()函数/方法,如:我们想把日期格式从“11/27/2012”改写为“2020-11-27”:
import re

str = "今天是11/6/2020    明天是11/7/2020"
s2 = re.sub(r"(\d+)/(\d+)/(\d+)",r"\3-\1-\2",str)
print(s2)
结果:
今天是2020-11-6    明天是2020-11-7
        6.sub()的第一个参数是匹配模式,第二个参数是要替换上的模式。类似“\3”这样的反斜杠加数字的符号代表着模式中捕获组的数量,其实正则是很强大的,想写出很棒的正则确实需要功力和经验,正则需要学习的还很多。
        7.有时有这样的需求,不区分大小写在文本中进行查找或者替换,我们可以使用re模块并且对各种操作都要加上re.IGNORECASE 标记:
str = 'PYTHON, java , c, GO,c++  python SQL'
s2 = re.findall('python',str,flags=re.IGNORECASE)
print(s2)
结果:
['PYTHON', 'python']


import re
str = 'PYTHON, java , c, GO,c++  python SQL'
s2 = re.sub('python','HAHAHA',str,flags=re.IGNORECASE)
print(s2)
结果:
HAHAHA, java , c, GO,c++  HAHAHA SQL
        8.下面说一下贪婪匹配和非贪婪匹配,有时我们用正则去匹配的时候,会有两种或多种情况都符合我们写的正则匹配规则,但是有一些结果并不是我们期望的:
import re

re_rule = re.compile(r'\"(.*)\"')
str = '我喜欢"夜空中最亮的星"这首歌'
result = re_rule.findall(str)
print(result)
结果:
['夜空中最亮的星']

re_rule = re.compile(r'\"(.*)\"')
str = '我喜欢"夜空中最亮的星"这首歌 ,你喜欢"故乡"这首歌'
result = re_rule.findall(str)
print(result)
结果:
['夜空中最亮的星"这首歌 ,你喜欢"故乡']
        9.上面的这个例子中,采用的时贪婪匹配,尽可能的匹配符合规则的匹配项,但是结果不是我们要的,我们要最短的匹配项,我们只需要在*后面加?修饰符就可以了,这就是非贪婪匹配
import re

re_rule = re.compile(r'\"(.*?)\"')
str = '我喜欢"夜空中最亮的星"这首歌 ,你喜欢"故乡"这首歌'
result = re_rule.findall(str)
print(result)
结果:
['夜空中最亮的星', '故乡']
        10.有时我们想用正则对一段文本和进行匹配,并且希望它能匹配全文,把符合要求的都找出来,我们一般都用(.)来匹配任意字符,但是(.)不能匹配换行符,如下例子,(?:.|\n)指定了一个非捕获组,?:指定以什么符号开始匹配,re.compile()函数里的re.DOTALL也可以支持换行匹配
import re
re_rule = re.compile(r'/\*(.*?)\*/')
str ="""
/*fsdfsdf
     sdfsdfasfd*/
"""
result = re_rule.findall(str)
print(result)
结果:
[]


re_rule = re.compile(r'/\*((:?.|\n)*?)\*/')
str ="""
/*fsdfsdf
     sdfsdfasfd*/
"""
result = re_rule.findall(str)
print(result)
结果:
[('fsdfsdf\n     sdfsdfasfd ', ' ')]
        11.有时我们需要在字符串中去掉我们不想要的字符,可以使用strip()方法:
str = ",,,,,,,,,,苹果"
s2 = str.strip(',')
print(s2)
结果:
苹果
        12.对文本处理,我们可以使用str.supper()方法可以让字符串大写,str.lower()方法可以让字符串小写,str.ljust()让文本左对齐,str.rjust()让文本右对齐,str.center()让文本居中对齐,format()函数也可以实现这些功能:
str = '可乐很好喝'
print(format(str,'>20'))
print(format(str,'^20'))
结果:
               可乐很好喝
       可乐很好喝  
        13.join()方法可以合并序列中的所有字符串
l1 = ['你','想要','吃什么' ]
str = ''.join(l1)
print(str)
结果:
你想要吃什么

l1 = ['我','决定','要吃',18,'个苹果']
str = ''.join(str(i) for i in l1 )
print(str)
结果:
我决定要吃18个苹果

你可能感兴趣的:(10分钟提升课,python,字符串,正则表达式)