一,常用的表达式及用法
| 表达式 | 含义 |
|---|---|
| \d | 数字 |
| \D | 非数字 |
| – | – |
| \w | 字母数字下划线 |
| \s | 空白符包括换行符 |
| \S | 非空白符不包括换行符 |
| . | 任意字符不包括换行符 |
| [ ] | 枚举匹配括号中的字符 |
| [^] | 枚举取反,匹配括号中除外 |
| * | 子表达式零次或多次 |
| ^ | 匹配字符串的开头 |
| + | 子表达式一次或多次 |
| ? | 子表达式零次或一次,或指一个非贪婪限定符 |
| \ | 转义 |
| $ | 匹配字符的结尾 |
| {n,m},{n},{m} | 匹配前面子表达式至少n次,至多m次 |
| | | 或 |
| () | 分组 |
| (?:) | 非捕获组 |
| abc1(?=abc2) | 匹配abc2前面的abc1 |
| (?<=abc2)abc1 | 匹配abc2前面的abc1 |
| abc1(?!abc2) | 匹配后面不是abc2的abc1 |
| (?<!abc2)abc1 | 匹配前面不是abc2的abc1 |
?子表达式零次或一次
import re
a = 'banan'
b = 'banaon'
for i in [a, b]:
regex = re.search(r'banao?n',i)
if regex:
print(regex.group())
else:
print("未收到")
#banan
#banaon
枚举[ ]
枚举取反[^ ]
import re
text = '123454165848-45415]'
a = re.search(r'[0-9-\]]+',text)
print(a.group())
text2 = '沉舟侧畔千帆过,病树前头万木春'
a2 = re.search(r'[\u4e00-\u9fa5,]+',text2)
print(a2.group())
text3 = '123456asfbfajhsf1254465'
a3 = re.search(r'[^0-9]+',text3)
print(a3.group())
贪婪非贪婪,+与*
import re
text = '去公园,去动物园,去游乐园'
a = re.search(r'去.*?园',text)
print(a.group())
text2 ='饼干好吃'
text3 ='饼干 好吃'
for i in [text2,text3]:
regex = re.search(r'饼干\s*好吃',i)#此处只能*
if regex:
print(regex.group())
else:
print('未找到')#```#```
非捕获组:(?😃
import re
text ='abcd123456'
a = re.search(r'(?:abcd)|(123456)',text)
print(a.group())#(?:后的是不需要的)
(?<=)
(?<!abc2)abc1
import re
text_list = [
'小王去玩游戏',
'小明去玩游戏',
'小张去玩游戏',
'小杰去玩游戏',
]#不让小杰去玩游戏
for text in text_list:
regex = re.search(r'(?<!小杰)去玩游戏',text)
if regex:
print(regex.group())
else:
print(f'没匹配到:{text}')#输出为没匹配到小杰去玩游戏
?!是不匹配 ?=是要匹配
import re
text_list = [
'152@aa.dom',
'152@bb.dom',
'152@cc.dom',
]
for text in text_list:
regex = re.search(r'\d*@(?=cc).*?$',text)
if regex:
print(regex.group())#152@cc.dom
二,常用floag方法re方法
subn替换,会返回一个元组
sub:替换
import re
text1 = "12345k"
b = re.sub(r'\d*','a',text1)
c = re.subn(r'\d*','a',text1)
print(b)#aaka
print(c)#('aaka', 3)
split:拆分
import re
a = "沉舟侧畔:千帆过,病树前头:万木春."
text = re.split('[,:]',a)
print(text)
match:匹配开头从开头开始匹配
fullmatch:全文匹配,
match相当于search前面加上^,
fullmatch相当于search前面^,后面加上$
import re
text1 = "123456789123456aaa"
a = re.compile(r'\d*')
result = a.match(text1)
print(result.group())#123456789123456
result2 = a.fullmatch(text1)
print(result2)#None
result3 = re.search(r'^\d*$',text1)
print(result3)#None
I:忽略大小写
X:添加注释
search:出现的匹配
S:忽略换行符
M:拆分行,多行匹配,影响^$
import re
a = "蜀道之难难于上青天A123456789\n沉舟侧畔千帆过a123456789\n"
end = re.search(r'.*',a,re.S)
print(end.group())
#蜀道之难难于上青天A123456789 没有S只会取到换行符
#沉舟侧畔千帆过a123456789
findall:找所有
M:拆分行,多行匹配,影响^$
import re
a = "蜀道之难难于上青天A123456789\n沉舟侧畔千帆过a123456789\n"
end = re.findall(r'.*',a,re.M)
print(end)#['蜀道之难难于上青天A123456789', '', '沉舟侧畔千帆过a123456789', '', '']
import re
text= 'xxxxxxxxxxxxxxxxxx'
a = re.findall(r'xxx',text,re.S)
print(a)#查找xxx在text中出现的次数
finditer:
import re\
text= 'xxxxxxxxxxxxxxxxxx'
a = re.finditer(r'xxx',text,re.S)
for i in a:
print(i.group())
重叠匹配
只能向前进行操作
import re
import regex as re
a = 'textextext'
b = re.findall(r'text',a,overlapped= True)
print(b)
print(len(b))#输出为['text',text]2
回溯
相同的结果,性能有差异,回溯可能会出现响应越来越慢,停止运行到后面。
import re
a = 'cccccd'
regex = re.compile(r'c+d')
regex2 = re.compile(r'c.*cd')
print('1',regex.search(a).group())#0次回溯
print('2',regex2.search(a).group())#1次回溯

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



