用来处理字符串,对字符串进行检索和替换,另外正则在python爬虫的应用也是相当广泛!
正则语法`# 1、数字和字母都表示它本身, . 表示匹配除了换行以外的任意字符, . 表示匹配 . # 2、很多字母前面添加 会有特殊含义 - n:换行 - t:制表符 - d: 匹配数字,等价[0-9] - D:非数字,等价于[^0-9] - w:表示数字、字母以及下划线,中文,等价于[0-9a-zA-Z_] - W:表示w取反 - s:表示任意的非打印字符(空格、换行、制表符) - S:表示非空白字符 # 3、绝大多数标点都有特殊含义 - ():用来表示一个分组,如果需要表示括号,需要使用 - []: 匹配范围,[0-9] 表示0~9范围中的一个,[0-9a-zA-Z] - |: 表示或者的意思 re.search(r'f(x|y|z)m','pdsfxm') 匹配fxm - {},{2,},{,3},{1,3}:用来限定前面元素出现的次数 re.search(r'go{2}d','good') - *: 表示前面的元素出现的次数为0次及以上,等价于{0,} - +: 表示前面的元素出现的次数为1次及以上,等价于{1,} - ^:以指定的内容开头,或者取反的意思 - $:以指定的内容结尾 # 4、 ? 的两种用法 - 规定前面元素出现的次数最多只能出现1次,等价于{,1} - 将贪婪模式转换为非贪婪模式(重点)`
re模块的介绍XM返佣 https://www./brokerlist/xm.html该模块是python中专门用于处理正则的默认,提供了相关的方法常用方法match、search 只查询一次 finditer 查找到所有的匹配数据放到一个可迭代对象中 findall 把查找到的所有字符串结果放到一个列表中 fullmatch 完全匹配,字符串需要满足正则表达式
Match类的使用调用re.match,re.search或者对re.finditer的遍历返回的对象都是re.Match对象Match类的属性和方法- pos、endpos 被查找字符串的起始和终端位置
`import re
m = re.search(r'c.*z', 'abcdefgz') print(m.pos) # 0 print(m.endpos) # 8 print(m.span()) # (2, 8) # 使用group获取获取到匹配的字符串 print(m.group()) # cdefgz
# group表示正则表达式的分组 # 1、在正则表达式里使用()表示一个分组 # 2、如果没有分组,默认只有一组 # 3、分组的下标从0开始
# 这里有4个分组 m1 = re.search(r'(1.*)(2.*)(3.*4)', 'a1bcd2efgh3ij4k') print(m1.group()) # 默认就是第0组 1bcd2efgh3ij4 print(m1.group(0)) # 第0组就是把整个正则表达式当做一个整体 1bcd2efgh3ij4 print(m1.group(1)) # 1bcd print(m1.group(2)) # 2efgh print(m1.group(3)) # 3ij4
# groups() 将分组以元组的形式返回 print(m1.groups()) # ('1bcd', '2efgh', '3ij4')
# (?P<name> 表达式) 给分组取个名字 m2 = re.search(r'(?P<one>1.*)(?P<two>2.*)(?P<three>3.*4)', 'a1bcd2efgh3ij4k') print(m2.groupdict()) # {'one': '1bcd', 'two': '2efgh', 'three': '3ij4'}`
- 在re模块,可以使用re.方法调用函数,还可以调用re.compile得到一个对象
`import re
# 这两种写法没有区别 m = re.search(r'm.*a', '111m22222a') print(m) # <re.Match object; span=(3, 10), match='m22222a'>
m2 = re.compile(r'm.*a') result = m2.search('111m22222a') print(result) # <re.Match object; span=(3, 10), match='m22222a'>`
正则修饰符`import re
# . 表示除了换行以外的任意字符 x = re.search(r'm.*a', 'abcdmonxxxa') print(x) # None
# re.S 匹配换行 y = re.search(r'm.*a', 'abcdmonxxxa', re.S) # 让 . 匹配换行 print(y)
a = re.search(r'x', 'helloXyz') print(a) # None # re.I 忽略大小写 b = re.search(r'x', 'helloXyz', re.I) print(b) # <re.Match object; span=(5, 6), match='X'>
# re.M 让$ 匹配到换行 m = re.findall(r'w+$', 'i am boyn you are girln he is man') print(m) # ['man'] n = re.findall(r'w+$', 'i am boyn you are girln he is man', re.M) print(n) # ['boy', 'girl', 'man']`
正则替换`import re
# 把数字替换成x m = re.sub(r'd', 'x', 'hello123wor123ld') print(m) # helloxxxworxxxld
n = re.sub(r'd+', 'x', 'hello123wor123ld') print(n) # helloxworxld
# 需求:将p中内容的数字乘2 p = 'hello50good34' def test(x): y = int(x.group(0)) y *= 2 return str(y) # 这里只能以字符串的形式返回
print(re.sub(r'd+', test, p)) # hello100good68`
贪婪模式与非贪婪模式在正则表达式里,默认采用的是贪婪模式,尽可能匹配多的字符串
在贪婪模式后面添加?,可将贪婪模式转化为非贪婪模式import re
m = re.search(r'm.*a', 'abcm123a456a') print(m) # m123a456a,这里为什么不是m123a呢?因为这里默认使用的贪婪模式 n = re.search(r'm.*?a', 'abcm123a456a') print(n) # m123a 使用?将贪婪模式转化为非贪婪模式
# ? print(re.match(r'aa(d+)', 'aa123bb456').group(1)) # 123 print(re.match(r'aa(d+?)', 'aa123bb456').group(1)) # 1 print(re.match(r'aa(d+?)', 'aa123bb456').group(0)) # aa1
# 虽然说是尽可能少的匹配,但也要满足匹配呀 print(re.match(r'aaa(d+)ddd', 'aaa2333ddd').group(0)) # aaa2333ddd print(re.match(r'aaa(d+?)ddd', 'aaa2333ddd').group(1)) # 2333
print(re.match(r'aaa(d+).*', 'aaa2333ddd').group(0)) # aaa2333ddd print(re.match(r'aaa(d+?).*', 'aaa2333ddd').group(1)) # 2
|