正则规则
1、本身是哪一个字符,就匹配字符串中的哪一个字符;
2、字符组:[字符],一个字符组匹配一个字符;
3、非字符组:[^],匹配不符合字符组中的内容
3、元字符:
- \d:表示0-9任意数字
- \w:表示数字、字母、下划线
- \s:表示空格、换行符(\n)、制表符(\t)
- \D:表示非数字
- \W:表示非数字字母下划线
- \S:表示非空格、换行符、制表符
- .:表示除换行符之外的任意内容
- ^:表示一个字符的开始
- $:表示一个字符的结束
- |:表示或,要匹配的长字符总在|之前
- ():表示分组
4、量词: - {n}:表示出现n次
- {n,}:表示至少出现n次
- {n,m}:表示至少出现n次,至多出现m次
- *:表示出现0次或多次
- +:表示出现1次或多次
- ?:表示出现0次或1次
5、正则默认贪婪匹配,即在符合量词条件下尽可能多匹配
6、非贪婪匹配(惰性匹配):量词后面的?才是非贪婪模式
元字符+量词+?+x:表示按照元字符规则在量词范围内匹配,遇到x就结束 - .*?x:匹配任意内容任意多次直到遇见x就结束
re模块
1、re.findall()
返回列表
import re
res = re.findall('\d+', 'as123rt566')
print(res)
['123', '566']
2、re.search()
返回一个对象且这个对象是从待匹配对象中匹配到的第一个符合条件的项,要用到group()来取值,如果没有符合条件的匹配项则输出None
import re
res = re.search('\d+', 'as123rt566')
print(res)
print(res.group())
<_sre.SRE_Match object; span=(2, 5), match='123'>
123
3、re.match()
只能从待匹配对象开头开始匹配,相当于re.search(’^/d+’,str)
res = re.match('\d+', 'as123rt566')
print(res)
None
res = re.match('\d+', '1as123rt566')
print(res.group())
1
4、re.finditer()
可以降低空间复杂度
res = re.finditer('\d+', 'as123rt566'*20)
print(res) #res是迭代器
for i in res:
print(i.group())
<callable_iterator object at 0x10f1e8978>
5、re.compile()
对正则表达式进行编译,在多个待匹配对象使用同一个正则表达式的时候使用,可以降低时间复杂度
res = re.compile(‘正则表达式’)
res.findall/finditer/search(‘待匹配对象’)
import re
res = re.compile('\d+')
print(res)
re.compile('\\d+')
res1 = res.search('123errt4567')
print(res.group())
123
6、re.split()
切割待匹配对象
import re
res = re.split('\d+', '123gfh78hu')
print(res)
['', 'gfh', 'hu']
res = re.split('(\d+)', '123gfh78hu')#默认自动保存分组中的内容
print(res)
['', '123', 'gfh', '78', 'hu']
7、re.sub()
相当于字符串中的replace
import re
res = re.sub('\d+', 'w', '12gg3')
print(res)
wggw
res = re.sub('\d+', 'w', '12gg3', 1)#2表示替换前几个
print(res)
wgg3
8、re.subn()
返回一个元祖,包含替换后的内容和替换了几个
import re
res = re.subn('\d+', 'w', '12gg3')
print(res)
('wggw', 2)
9、分组在re中的使用
str1 = '<h1>hahahaha</h1>'
str2 = '<a>hahahaha hehehehe</a>'
import re
res = re.search('<\w+>.*?</\w+>', str1)
print(res)
<_sre.SRE_Match object; span=(0, 17), match='<h1>hahahaha</h1>'>
#结合分组
res = re.search('<(\w+)>(.*?)</(\w+)>', str1)
print(res.group(1))
h1
print(res.gropu(2))
hahahaha
print(res.group(3))
h1
print(res.group(0))#等价于res.group()
<h1>hahahaha</h1>
给分组取名
语法:?P<名字>正则表达式
import re
res = re.search('<(?P<tag>\w+)>(?P<cont>.*?)</(\w+)>', str1)
print(res.group(tag))
print(res.group(cont))
h1
hahahaha
引用分组命名
语法:?P=名字
str1 = '<h1>hahahaha</h2>'
import re
res = re.search('<(?P<tag>\w+)>(?P<cont>.*?)</(?P=tag\w+)>', str1)
print(res)
None#因为str1末尾是h2所有匹配不到,若str1末尾是h1,则会匹配到
引用分组命名的另外一种方法
import re
res = re.search(r'<(?P<tag>\w+)>(?P<cont>.*?)</\1>', str1)#\1表示取第一个分组中的内容
print(res)
<_sre.SRE_Match object; span=(0, 17), match='<h1>hahahaha</h1>'>
10、分组遇到findall,则优先显示分组中的内容,可以使用取消分组优先显示
语法:?:正则表达式
import re
res = re.findall('\d(\d)', 'ww78')
print(res)
['8']
例:
import re
res = re.findall('\d+', r'1-2*(60+(-40.35/5)-(-4*3))')
print(res)
['1', '2', '60', '40', '35', '5', '4', '3']
这样就把小数也匹配成整数
import re
res = re.findall('\d+\.\d+|(\d+)', r'1-2*(60+(-40.35/5)-(-4*3))')
print(res)
['1', '2', '60', '', '5', '4', '3']
当不想匹配的内容出现在匹配内容中时,可以先匹配不想匹配的内容,然后再通过各种方式去掉不想匹配的内容

本文详细介绍了Python中的正则规则,包括字符、字符组、元字符及其量词,以及贪婪与非贪婪匹配。同时,讲解了re模块的各种方法,如`findall()`、`search()`、`match()`、`finditer()`、`compile()`、`split()`、`sub()`和`subn()`,并提到了分组的使用技巧。
2577

被折叠的 条评论
为什么被折叠?



