通过导入re模块,使得程序可以使用正则表达式。
一.字符匹配
findall(x,str) 遍历字符串,找到正则表达式匹配的所有位置,并以列表的形式返回。
import re
re.findall('clocky7','clocky7 is a nice clocky7')
['clocky7', 'clocky7']
match 判断一个正则表达式是否从开始处匹配一个字符串。
x = re.match('clocky7','clocky7 is a nice clocky7')
print(x)
y = re.match('is','clocky7 is a nice clocky7')
print(y)
<re.Match object; span=(0, 7), match='clocky7'>
None
search 遍历字符串,找到正则表达式匹配的第一个位置,返回匹配对象。
re.search('clocky7','he is a good clocky7')
<re.Match object; span=(13, 20), match='clocky7'>
finditer() 遍历字符串,找到正则表达式匹配的所有位置,并以迭代器的形式返回
r = re.finditer('ky','clocky is a good 1ky1')
print(type(r))
for i in r:
print(i)
<class 'callable_iterator'>
<re.Match object; span=(4, 6), match='ky'>
<re.Match object; span=(18, 20), match='ky'>
二.正则的规则
hqyj匹配文本中的hqyj
re.findall('hqyj','hqyj is a nice hqyj')
['hqyj', 'hqyj']
[hqyj]匹配h或者q或者y或者j字符
# 这里引号要写在[]外,因为这个地方就是要填字符串
re.findall('[hqyj]','hqyj is a nice hqyj')
['h', 'q', 'y', 'j', 'h', 'q', 'y', 'j']
[^hqyj]匹配除了hqyj以外的其他字符
re.findall('[^hqyj]','hqyj is a nice hqyj')
[' ', 'i', 's', ' ', 'a', ' ', 'n', 'i', 'c', 'e', ' ']
[a-z]匹配a~z的任意字符([0-9]也可以)
re.findall('[a-z]','he is a 12345')
['h', 'e', 'i', 's', 'a']
. 匹配除了换行符以外的任意字符,空字符也可以返回
re.findall('.','he is a 12345')
['h', 'e', ' ', 'i', 's', ' ', 'a', ' ', '1', '2', '3', '4', '5']
. 后还可以添加字符匹配,其表示(默认)匹配一个任意字符加上特定字符匹配
a = re.findall('.12','he is a 12345')
print(a)
#贪婪匹配(匹配最长的)
b = re.findall('.+12','he is a 12345')
print(b)
# 可以是没有字符(空),用 - 表示
c = re.findall('.+?12','12 he is a 12345')
print(c)
[' 12']
['he is a 12']
['12 he is a 12']
三.特殊字符
import re
# \d 匹配任何十进制数字;相当于类 [0-9]
re.findall(r'\d', 'abc123')
['1', '2', '3']
# \D与 \d 相反,匹配任何非十进制数字的字符;相当于类 [^0-9]
import re
s = '123abc456'
print(re.findall('\D',s))
['a', 'b', 'c']
<>:4: SyntaxWarning: invalid escape sequence '\D'
<>:4: SyntaxWarning: invalid escape sequence '\D'
C:\Users\Clocky7\AppData\Local\Temp\ipykernel_18016\3487280925.py:4: SyntaxWarning: invalid escape sequence '\D'
print(re.findall('\D',s))
# \s 匹配任何空白字符(包含空格、换行符、制表符等);相当于类 [ \t\n\r\f\v]
s = 'a\tb\nc\td'
print(re.findall('\s',s))
['\t', '\n', '\t']
<>:3: SyntaxWarning: invalid escape sequence '\s'
<>:3: SyntaxWarning: invalid escape sequence '\s'
C:\Users\Clocky7\AppData\Local\Temp\ipykernel_18016\4213507675.py:3: SyntaxWarning: invalid escape sequence '\s'
print(re.findall('\s',s))
# \S 与 \s 相反,匹配任何非空白字符
import re
s = 'a\tb\tc'
print(re.findall('\S',s))
['a', 'b', 'c']
<>:4: SyntaxWarning: invalid escape sequence '\S'
<>:4: SyntaxWarning: invalid escape sequence '\S'
C:\Users\Clocky7\AppData\Local\Temp\ipykernel_18016\108571978.py:4: SyntaxWarning: invalid escape sequence '\S'
print(re.findall('\S',s))
# \w 匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式[a-zA-Z0-9_]
s = 'hello world_1234\t\n'
print(re.findall('\w',s))
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '_', '1', '2', '3', '4']
<>:4: SyntaxWarning: invalid escape sequence '\w'
<>:4: SyntaxWarning: invalid escape sequence '\w'
C:\Users\Clocky7\AppData\Local\Temp\ipykernel_18016\159184317.py:4: SyntaxWarning: invalid escape sequence '\w'
print(re.findall('\w',s))
# \W 与 \w 相反 (注:re.ASCII 标志使得 \w 只能匹配 ASCII 字符)
import re
s = 'a1b2c3d4e5f6 g7h8i9j0'
print(re.findall('\W',s))
[' ']
<>:4: SyntaxWarning: invalid escape sequence '\W'
<>:4: SyntaxWarning: invalid escape sequence '\W'
C:\Users\Clocky7\AppData\Local\Temp\ipykernel_18016\603422700.py:4: SyntaxWarning: invalid escape sequence '\W'
print(re.findall('\W',s))
# \b 匹配一个单词边界,也就是指单词和空格间的位置。
# 例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
import re
s = 'clocky7 ikys a nice clocky'
t = re.findall(r'ky\b',s)
print(t)
['ky']
关于 \b 实际有一个需要注意的地方:
# \b 在系统中可能作为其他字符的转义字符,比如 \n \t 等,\b表示退格,前面的一个字符会消失。所以在正则表达式中,最好在字符串前加r
import re
s = 'clocky7 is a nice clocky'
# 可见此处,\b已经不是正则表达式的元字符了,因此没法匹配
t = re.findall('ky\b',s)
print(t)
#测试\b,应该输出lve
print ("test \\b :lo\bve")
[]
test \b :lve
# \B 与 \b 相反,'er\b' 不能匹配"never" 中的 'er',但能匹配 "verb" 中的 'er'。
import re
s = 'clocky7 ikys a nice clocky'
t = re.findall(r'ky\B', s)
print(t)
['ky', 'ky']
四.数量控制
import re
# *重复0次或多次
s = 'clocky7 is_a nice clocky77'
print(re.findall('clocky7*',s))
['clocky7', 'clocky77']
# +重复1次或多次
s = 'clocky7 is_a nice clocky77'
print(re.findall('7+',s))
['7', '77']
# ?重复1次或0次
import re
s = 'clocky7 is a nice clockyy7'
print(re.findall('kyy?', s))
['ky', 'kyy']
# {n}重复n次
import re
s = 'clocky666 is a clocky66'
print(re.findall('ky6{2}', s))
['ky66', 'ky66']
# {n,}重复n次或多次
import re
s = 'clocky666 is a clocky66'
print(re.findall('ky6{2,}', s))
['ky666', 'ky66']
# {n,m}重复n到m次
import re
s = 'clocky666 is a clocky66,and clocky6666666'
print(re.findall('ky6{2,3}',s))
['ky666', 'ky66', 'ky666']
五.分组
- () 提取兴趣区域
其前后可以规定字符,最终输出的是括号的要求的表达式。
import re
s = 'clocky7 is a nice clocky78898'
print(re.findall(r'clocky(\d+)', s))
['7', '78898']
- (|) 提取兴趣区域(| = or)
import re
s = '伊内斯得了MVP,琴柳得了MVP,温蒂得了MVP,维什戴尔得了MVP'
print(re.findall(r'(\w{2,})得了MVP', s))
['伊内斯', '琴柳', '温蒂', '维什戴尔']
六.开始与结束
^ 表示从字符串开头进行操作,不去找下面的字符
import re
s = "clocky7 is a good clocky8"
print(re.findall(r"^clocky\d", s))
['clocky7']
$ 表示从字符串结尾进行操作,不去找前面的字符
import re
s = "clocky7 is a good clocky8"
print(re.findall(r'clocky\d$', s))
['clocky8']
注意:由于正则表达式中 * . \ {} () 等等符号具有特殊含义,如果你指定的字符正好就是这些符号,需要用 \ 进行转义
七.正则表达式常见方法
由于前面提过了 findall() , match() , serch() 方法,接下来介绍一些不同的:
sub(a,b,c) 替换匹配成功的字符,a是被替换的,b是替换上去的,c是字符串
类似与字符串的replace函数
import re
s = 'clocky7 is a clock'
print(re.sub('clocky7','MOl',s))
MOl is a clock
split 根据匹配成功的位置对字符串进行分割
import re
s = 'clocky7 like6 arknights'
print(re.split(r'\d+',s))
['clocky', ' like', ' arknights']