常用的匹配模式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
re 模块使 Python 语言拥有全部的正则表达式功能。
re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.match(pattern, string, flags=0)
- pattern 匹配的正则表达式
- string 要匹配的字符串
- flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见末尾:正则表达式修饰符 - 可选标志
匹配成功re.match方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式
- 最常规的匹配
import re
str = 'Hello 123 4567 World'
print(len(str)) #输出str的长度
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w\wrld$', str)
print(result)
print(result.group())
print(result.span()) #输出匹配到的字符串的位置
result =re.match('^Hello\s(\d\d\d)\s\d{4}\s(\w\wrld)$', str)
print(result.group(),'\ngroup(1)',result.group(1),'\ngroup(2)',result.group(2))#group(1)为正则表达式中第一个括号内的内容
print(result.span())
result = re.match('^Hello\s\d\d\d',str) #只匹配Hello 123
print(result.group())
print(result.span())
运行结果
20
<re.Match object; span=(0, 20), match='Hello 123 4567 World'>
Hello 123 4567 World
(0, 20)
Hello 123 4567 World
group(1) 123
group(2) World
(0, 20)
Hello 123
(0, 9)
- 泛匹配
import re
str = 'Hello 123 666 World_This is a Regex Demo'
result = re.match('^Hello.*Demo$', str)
print(result)
print(result.group())
print(result.span())
result = re.match('^Hello.*?6', str)
print('非贪婪方式匹配',result.group())
result = re.match('^Hello.*6', str)
print('贪婪方式匹配',result.group())
其中
.* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符
.*? 使用非贪婪方式匹配任意的字符
运行结果
<re.Match object; span=(0, 40), match='Hello 123 666 World_This is a Regex Demo'>
Hello 123 666 World_This is a Regex Demo
(0, 40)
非贪婪方式匹配 Hello 123 6
贪婪方式匹配 Hello 123 666
- 匹配目标
import re
str = 'Hello 123 4567 World'
print(len(str)) #输出str的长度
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w\wrld$', str)
print(result)
print(result.group())
print(result.span()) #输出匹配到的字符串的位置
result =re.match('^Hello\s(\d\d\d)\s\d{4}\s(\w\wrld)$', str)
print(result.group(),'\ngroup(1)',result.group(1),'\ngroup(2)',result.group(2))#group(1)为正则表达式中第一个括号内的内容
print(result.span())
运行结果
Hello 123 4567 World
group(1) 123
group(2) World
(0, 20)
总结: 尽量使用泛匹配、使用括号得到匹配目标、尽量使用非贪婪模式、有换行符就用re.S
re.search函数
re.search 扫描整个字符串并返回第一个成功的匹配。
import re
str = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
result = re.search('.*?(\d+).*?Demo', str)
#匹配多个数字
print(result)
print(result.group(1))
运行结果
1234567
总结:为匹配方便,能用search就不用match
re.findall函数
搜索字符串,以列表形式返回全部能匹配的子串。
import re
str = '123 456 abc 789 ddd sd 12d'
results = re.findall('\d+ ', str)
#匹配多个数字
print(results)
for result in results :
print(result)
运行结果
['123 ', '456 ', '789 ']
123
456
789
re.sub函数
替换字符串中每一个匹配的子串后返回替换后的字符串。
import re
str = '123 456 abc 789 ddd sd 12d'
result = re.sub('\d','0',str)
#把所有的数字替换成0
print(result)
运行结果
000 000 abc 000 ddd sd 00d
re.compile函数
将正则字符串编译成正则表达式对象。
将一个正则表达式串编译成正则对象,以便于复用该匹配模式。
import re
str = '''Hello 1234567 World_This
is a Regex Demo'''
pattern = re.compile('Hello.*Demo', re.S)
#匹配的字符串中存在换行符是使用re.S
result1 = re.match(pattern, str)
print('result1',result1)
result2 = re.match('Hello.*Demo', str, re.S)
print('result2',result2)
运行结果
result1 <re.Match object; span=(0, 40), match='Hello 1234567 World_This\nis a Regex Demo'>
result2 <re.Match object; span=(0, 40), match='Hello 1234567 World_This\nis a Regex Demo'>
正则表达式修饰符 - 可选标志
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |