实际使用
正则解决的是高效率使用字符串的问题,而字符串操作贯穿整个程序执行,其重要程度可见一斑。
另外,爬虫对正则是强需求。
re.findall和re.sub是最常用的,也是最易用的,至于re.match和re.search不知为何所有正则都要大篇幅介绍,但是用起来繁琐,比findall差远了,这里不列举。
典型用例
1 字符集——概括性的字符集使用
d s w
L = "python123php932-we2 w@3"
# 1 字符集——概括字符集 s w d . 大写是互补
a1 = re.findall(r"d",L) #d 表示数字[0-9]
a2 = re.findall(r"D",L) #D 表示非数字
a3 = re.findall(r"w",L) #w 表示数字和字母
a4 = re.findall(r"W",L) #W 表示非数字和字母
a5 = re.findall(r"s",L) #s 表示空格键
a6 = re.findall(r"S",L) #S 表示匹配非空格键
print(a1)#['1', '2', '3', '9', '3', '2', '2', '3']
print(a2)#['p', 'y', 't', 'h', 'o', 'n', 'p', 'h', 'p', '-', 'w', 'e', ' ', 'w', '@']
print(a3)#['p', 'y', 't', 'h', 'o', 'n', '1', '2', '3', 'p', 'h', 'p', '9', '3', '2', 'w', 'e', '2', 'w', '3']
print(a4)#['-', ' ', '@']
print(a5)#[' ']
print(a6)#['p', 'y', 't', 'h', 'o', 'n', '1', '2', '3', 'p', 'h', 'p', '9', '3', '2', '-', 'w', 'e', '2', 'w', '@', '3']
2 字符集——量词的使用
基本量词
L = "python123php932java278js w@3"
a1 = re.findall("[a-z]{2,6}", L)# [a-z]表示需要匹配的字母范围;{2,6}表示量词,重复的次数范围
print(a1)# ['python', 'php', 'java', 'js']
其他量词:*?+
L = "pytho3php2python3pythonnn328jsw@3"
a1 = re.findall("python*", L)# *匹配前面字符0次或者无限多次
a2 = re.findall("python+", L)# +匹配前面字符1次或者无限多次
a3 = re.findall("python?", L)# ?匹配零次或者一次,可以去重
print(a1)# ['pytho', 'python', 'pythonnn']
print(a2)# ['python', 'pythonnn']
print(a3)# ['pytho', 'python', 'python']
3 字符集——贪婪和非贪婪
从2的例子可以看出,当量词是{2,6}时,因为默认的贪婪搜索模式,所以即使符合最小值2时,查找依旧不停,继续查找至6.这就是所谓贪婪。在后面加个?可以变成非贪婪匹配。据说正则的坑大部分都在此。
L = "python123php932java278js w@3"
a1 = re.findall("[a-z]{2,6}", L)# [a-z]表示需要匹配的字母范围;{2,6}表示量词,重复的次数范围
print(a1)# ['python', 'php', 'java', 'js']
a2 = re.findall("[a-z]{2,6}?", L)
print(a2)#['py', 'th', 'on', 'ph', 'ja', 'va', 'js']
4 边界匹配:^$
举例,想要匹配4-9位的qq号,如果单纯使用量词而不使用边界占位符进行匹配,很容易出现问题。
qq = "1000154501"#10位的qq号,使用下面正则进行匹配
a1 = re.findall("d{4,9}", qq)# 失败,因为竟然能匹配出来!
print(a1)# ['100015450']
a2 = re.findall("d{4,9$}", qq)
print(a2)# []
边界占位符,就是设定个靶点,$表示末尾,则^表示开头
qq = "qq1000154501"
a3 = re.findall("^d", qq)
print(a3)# [],因为是从第一个字符匹配,如果失败则为空
a4 = re.findall("d", qq)
print(a4)# ['1', '0', '0', '0', '1', '5', '4', '5', '0', '1']
5 re.sub的重大意义
简单替换
L = "A9849379541D11S"
a1 = re.sub("A","flower", L)# 将字符串中的A替换为flower
print(a1)# flower9849379541D11S
需要根据不同条件替换不同字符串时,可以把函数当作参数传入进来
L = "A698469379541D11S"
def sub_test(value):
tmp = int(value.group())
if tmp > 7:
return "9"
else:
return "0"
a1 = re.sub(r"d",sub_test, L)# 将大于7的字符替换为9,小于7的替换为0
print(a1)# A099009009000D00S
原文链接:https://blog.csdn.net/yueshuw123/article/details/106841570