正则表达式
1.修饰符
re.I | 使匹配对大小写不敏感 |
---|---|
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 忽略空白和注释,允许使用 ’#’ 来引导一个注释 |
import re
res1 = re.search(r'[a-z]+','liqiang110qasq').group()
print(res1) # liqiang
res2 = re.search(r'[a-z]+','LiQiangNlkj110qasq', re.I)
res3 = res2.group()
print(res2) # <re.Match object; span=(0, 6), match='liuyaN'>
print(res3) # LiQiangNlkj
2.字符
\w | 匹配字母数字 |
---|---|
\W | 非字母数字 |
\s | 任意空白字符[\t\n\r\f] |
\S | 非空字符 |
\d | 任意数字[0-9] |
\D | 非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’ |
\B | 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’ |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
\1…\9 | 匹配第n个分组的子表达式 |
import re
b = r"(abcabc)\1"
a = r"(a)(b)(c)\2"
# 一个括号就是一个组,\n选定指定次序n组的元素
# "(ab)(cd)(ef)\1"就是"(ab)(cd)(ef)(ab)"
# "(ab)(cd)(ef)\2"就是"(ab)(cd)(ef)(cd)"
match1 = re.match(a,'abcbabcd').group()
print(match1) # abcb
3.数量
^ | 匹配开头 |
---|---|
$ | 匹配末尾 |
. | 除了换行符的任意字符。当re.DOTALL指定时,则可匹配包括换行符的任意字符 |
[…] | [amk] 匹配 ‘a’或’m’或’k’ |
[^…] | [^abc] 匹配除了a,b,c之外的字符 |
* | 匹配0个或多个 |
+ | 1个或多个 |
? | 0个或1个,非贪婪方式 |
{ n} | 匹配n个 |
{ n,} | 多于n个 |
{ n, m} | n 到 m 次,贪婪方式 |
a | b |
() | 匹配括号内的表达式,也表示一个组 |
(?imx: re) | 在括号中使用i, m, 或 x 可选标志,re:表达式 |
(?-imx: re) | 在括号中不使用i, m, 或 x 可选标志 |
(?#…) | 注释 |
4.分组
import re
text = "元芳,你怎么看 3841359@qq.com和984654@189.com给个手机号,以后好联系15131255789,过年来玩15131266666呀"
# 返回匹配后加括号的内容
# 先忽略括号,整体匹配,然后以括号为组进行返回
data_list = re.findall("15(13)1(2\d{5})", text)
print(data_list) # [('13', '255789'), ('13', '266666')]
5.re模块
findall
获取匹配到的所有数据
match
从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
import re
text = "15131255789元芳,你怎么看 3841359@qq.com和984654@189.com给个手机号,以后好联系,过年来玩15131266666呀"
data_list = re.match("15(13)1(2\d{5})", text)
print(data_list) # <re.Match object; span=(0, 11), match='15131255789'>
search
匹配字符串,返回第一个匹配的。否则,返回None
import re
text = "元芳,你怎么看 3841359@qq.com和984654@189.com给个手机号,以后好联系15131255789,过年来玩15131266666呀"
data_list = re.search("15(13)1(2\d{5})", text)
print(data_list) # <re.Match object; span=(48, 59), match='15131255789'>
sub
替换匹配成功的位置
import re
text = "15131255789,15131266666"
data_list = re.sub("15(13)1(2\d{5})","号码", text)
print(data_list) # 号码,号码
split
根据匹配成功的位置分割
import re
text = "999881513125578945455,1513126666687878"
data_list = re.split("151312",text)
print(data_list) # ['99988', '5578945455,', '6666687878']
finditer
与findall类似。不同的是可以分组标记返回字典值
(?P\d{4})
import re
text = "kjio422202201502135219k51352318620314521Xtg"
#匹配身份证,把年月日标记后返回
data_list = re.finditer("\d{6}(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2})\d{3}[\d|X]", text)
for item in data_list:
info_dict = item.groupdict()
print(info_dict)
# {'year': '2015', 'month': '02', 'day': '13'}
# {'year': '1862', 'month': '03', 'day': '14'}