re模块 ==>> 正则表达式
re模块 ==>> 正则表达式
1.作用:进行模糊匹配
在Python中正则表达式是内嵌在python中,并通过re模块实现
在类的功能中通过正则表达式增加功能
2.调用re模块: import re
3.基本语法:在终端中可直接得出结果,PyCharm中需要print()才能得到结果
match
re.match(“匹配的内容”,”被匹配的字符串”)从字符的开头开始匹配,以匹配的内容开头,无结果默认none
# 终端 a = re.match("a", "asjkaakjsh") a.group # 打印,输出
# PyCharm a = re.match("a", "asjkaakjsh").group() print("1-match:", a)
search
re.search(“匹配的内容”,”被匹配的字符串”)
对整个文本进行搜索,找到第一个
# 终端 a = re.search("a", "asjkaakjsh") a.group()
# PyCharm a = re.search("a", "asjkaakjsh").group() print("2-secrch:", a)
findall
re.findall(“匹配的内容”,”被匹配的字符串”)
匹配所有
# 终端 re.findall("a", "asjkaakjsh")
# PyCharm a = re.findall("a", "asjkaakjsh") print("3-findall:", a)
finditer(用法同findall)
re.finditer(“匹配的内容”,”被匹配的字符串”)
匹配所有,与findall不同的是可以对结果for循环并group输出
split:
re.split(“作为分割的内容”,”需要进行分割的字符串”)
匹配分割,与findall相近
# 终端 re.split("a", "asjkaakjsh")
# PyCharm a = re.split("a", "asjkaakjsh") print("4-aplit:", a)
sub:
re.sub(“替换的规则”,”替换的内容”,”被替换的字符串”,count=1)
匹配替换,count==>替换的次数,如需全部匹配不写次数
# 终端 re.sub("a", "A", "asjkaakjsh")
# PyCharm a = re.sub("a", "A", "asjkaakjsh") print("5-sub:", a)
group:
re.group;re.groups;re.groupdict 输出结果,打印结果,
- re.group 输出结果为字符串
- re.groups 输出结果为元祖
- re.groupdic 输出结果为字典
4.字符匹配
a.普通字符:
大多数字符和字母都会和自身进行匹配
b.元字符:(以PyCharm为例,用终端自行更改)
. 匹配任意(除\n以外)的字符
a = re.search("a.", "asjkaakjsh").group() print("6-'.':", a) # 6-'.': as
^ 匹配以字符开头
a = re.match("^a", "asjkaakjsh li ").group() print("7-'.':", a) # 7-'.': a
+ 匹配符号前一个字符1~n次,通常按照最大的匹配,符号后面加一个?按照最小的匹配
a = re.search("a+", "asjkaakjsh li ").group() print("8-'+':", a) # 8-'+': a
$ 匹配字符结尾
a = re.search("a$", "asjkaakjsh lia") b = a.group() print("9-'$':", b) # 9-'$': a
* 匹配符号前的一个字符0~n次,代表所有
a = re.findall("a*", "asjkaakjsh lia") print("9-'*':", a) # 10-'*': ['a', '', '', '', 'aa', '', '', '', '', '', '', '', 'a', '']
? 匹配符号前的一个字符0~1次
a = re.findall("a?", "asjkaakjsh lia") print("9-'?':", a) # 11-'?': ['a', '', '', '', 'a', 'a', '', '', '', '', '', '', '', 'a', '']
{m} 匹配符号前的一个字符m次
a = re.search("a{2}", "asjkaakjsh lia").group() print("12-'{}':", a) # 12-'{}': aa
{n,m} 匹配符号前的一个字符n~m次
a = re.search("a{0,2}", "asjkaakjsh lia").group() print("13-'{}':", a) # 13-'{}': a
| 匹配符号的两侧其中一个条件即可
a = re.search("a|j", "asjkaakjsh lia").group() print("14-'|':", a) # 14-'|': a
[] [nm]或,匹配符号内n或m
a = re.search("[ja]", "asjkaakjsh lia").group() print("15-'[]':", a) # 15-'[]': a
[元字符],匹配字符本身(除个别符号外),无特殊意义,a[.]b==>a.b
a = re.search("a[.]a", "asjka.akjsh lia").group() print("16-'[]':", a) # 16-'[]': a.a
[n-m]至,匹配n~m
a = re.search("a[a-k]", "asjka.akjsh lia").group() print("17-'[]':", a) # 17-'[]': ak
[^]非
a = re.search("a[^a-k]", "asjka.akjsh lia").group() print("18-'[]':", a) # 18-'[]': as
[\]同\,具有特殊意义
a = re.findall("a[\d]", "asjka\dkjsh lia") print("19-'[]':", a) # 19-'[]': [] "\d具有特殊意义"
() 分组匹配
a = re.search("(abc){2}a(123|456)c", "abcabca456c").group() print("20-'()':", a) # 20-'()': abcabca456c
\ ⓵后面紧跟元字符表示去掉特殊功能;⓶后面紧跟普通字符表示实现特殊功能呢;⓷后面紧跟数字实现分组
\A 只从字符开头匹配
a = re.search("\Aalex","alexhsjdgf").group() print("21-'\\':", a) # 21-'\': alex
\Z 匹配字符结尾,同$
a = re.search("alex\Z", "hsjdgfalex").group() print("22-'\\':", a) # 22-'\': alex
\d 匹配10进制的数字,同[0-9]
a = re.search("\d", "hs2jdg3fal4ex").group() print("23-'\\':", a) # 23-'\': 2
\D 匹配非数字,同[^0-9]
a = re.search("\D", "hs2jdg3fal4ex").group() print("24-'\\':", a) # 24-'\': h
\w 匹配字母与数字,同[0-9a-zA-Z]
a = re.findall("\w", "hs2jdg3fal4ex") print("25-'\\':", a) # 25-'\': ['h', 's', '2', 'j', 'd', 'g', '3', 'f', 'a', 'l', '4', 'e', 'x']
\W 匹配非字符数字,同[^0-9a-zA-Z]
a = re.findall("\W", "hs2 jd.g3\t?fa\l4\nex") print("26-'\\':", a) # 26-'\': [' ', '.', '\t', '?', '\\', '\n']
\s 匹配空格\t\n\r等,同[\t\n\r\f\v]
a = re.findall("\W", "hs2 jd.g3\t?fa\l4\nex") print("27-'\\':", a) # 27-'\': [' ', '\t', '\n']
\S 匹配非空格\t\n\r等,同[^\t\n\r\f\v]
a = re.findall("\S", "h2 j.g3\t?\l4\n") print("28-'\\':", a) # 28-'\': ['h', '2', 'j', '.', 'g', '3', '?', '\\', 'l', '4']
\b 匹配单词边界,即单词和空格之间的位置
a = re.findall(r'e\b', 'my name is ') print("29-'\b':", a) # 29-': ['e']
# 示例:分组匹配(身份证)
(取到字典) a = re.search("(?P<provice>[0-9]{3})(?P<city>[0-9]{3})(?P<brithday>[0-9]{8})", "210726199001010101").groupdict() print("30-'()':", a) # 30-'()': {'provice': '210', 'brithday': '19900101', 'city': '726'} a = re.search("([0-9]{3})([0-9]{3})([0-9]{8})", "210726199001010101").groups() # [0-9]等同\d print("31-'()':", a) # 31-'()': ('210', '726', '19900101')
# 补充:匹配模式
re.M 多行匹配
re.X 多行注释(如果匹配的内容含空格,用此方法可以被匹配,如果用此方法,空格会被忽略)
1 # re.I 忽略大小写 2 a = re.search("[a-z]", "My name is Alex").group() 3 print("32-'re.I':", a) # 32-'re.I': y 4 a = re.search("[a-z]", "My name is Alex", flags=re.I).group() 5 print("33-'re.I':", a) # 33-'re.I': M
1 # re.S 任意匹配 2 a = re.search(".+", "My name\n is Alex").group() 3 print("34-'re.I':", a) # 34-'re.I': My name 4 a = re.search(".+", "My name is Alex", flags=re.S).group() 5 print("35-'re.I':", a) # 35-'re.I': My name is Alex
5."r"的意义
在匹配内容(规则)前写上“r”,表示忽略规则内符号在Python中的特殊意义,只将re模块中的特殊意义作用于被匹配的字符串