文章目录
1.正则表达式符号
? | 匹配零次或一次前面的分组 |
---|---|
* | 匹配零次或多次前面的分组 |
+ | 匹配一次或多次前面的分组 |
{n} | 匹配 n 次前面的分组 |
{n,} | 匹配 n 次或更多前面的分组 |
{,m} | 匹配零次到 m 次前面的分组 |
{n,m} | 匹配至少 n 次、至多 m 次前面的分组 |
{n,m}? 或 *? 或 +? | 对前面的分组进行非贪心匹配 |
^spam | 意味着字符串必须以 spam 开始 |
spam$ | 意味着字符串必须以 spam 结束 |
. | 匹配所有字符,换行符除外 |
\d \w \s | 分别匹配数字、单词和空格 |
\D \W \S | 分别匹配出数字、单词和空格外的所有字符 |
[abc] | 匹配方括号内的任意字符(诸如 a、 b 或 c) |
[^abc] | 匹配不在方括号内的任意字符 |
2.创建正则表达式对象
python中所有正则表达式的函数都在re模块中。
import re
2.1 正则表达式匹配步骤:
- import re 导入正则表达式模块
- 用re.compile()函数创建一个Regex对象(使用原始字符串)
- 向 Regex 对象的 search()方法传入想查找的字符串。它返回一个 Match 对象
- 调用 Match 对象的 group()方法,返回实际匹配文本的字符串
#!/usr/bin/python3
import re
hero=re.compile(r'Batman')
mo=hero.search('Batman and Tina')
mo.group()
管道符 | 可以匹配许多表达式中的一个 |
---|
第一次出现匹配文本,将作为Match对象返回
search()返回的 Match 对象只包含第一次出现的匹配文本
使用 findall() 方法,包含被查找字符串中的所有匹配
#!/usr/bin/python3
import re
hero = re.compile(r'Batman | Tina')
mo = hero.search('Batman and Tina Fey')
print(mo.group())
print(hero.findall('Batman and Tina Fey'))
? | 表明它前面的分组是可选的 |
---|
#!/usr/bin/python3
import re
bat = re.compile(r'Bat(wo)?man')
mo = bat.search('The Adventures of Batman')
print(mo.group())
mo1 = bat.search('The Adventures of Batwoman')
print(mo1.group())
用花括号匹配特定次数,也可以不写花括号中的第一个或第二个数字,不限定最小值或最大值
#!/usr/bin/python3
import re
ha = re.compile(r'(Ha){3}')
mo = ha.search('HaHaHa')
print(mo.group())
2.2 贪心和非贪心匹配
python的正则表达式默认是“贪心”的,这表示在有二义的情况下,它们会尽可能匹配最长的字符串。花括号的“非贪心”版本匹配尽可能最短的字符串,即在结束的花括号后跟着一个问号
#!/usr/bin/python3
import re
ha = re.compile(r'(Ha){3,5}')
mo = ha.search('HaHaHaHaHa')
print(mo.group())
ha1 = re.compile(r'(Ha){3,5}?')
mo1 = ha1.search('HaHaHaHaHa')
print(mo1.group())
2.3 建立自己的字符分类
可以使用短横表示字母或数字的范围,左方括号后加上一个插入字符(^), 就可以得到“非字符类”
[a-zA-Z0-9] | 匹配所有的小写字母、大写字母和数字 |
---|---|
[^aeio] | 匹配不在这个字符类的所有字符 |
2.4 插入字符和美元字符
可以在正则表达式的开始处使用插入符号(^),在正则表达式的末尾加上美元符($)
^ | 匹配必须发生在被查找文本开始处 |
---|---|
$ | 字符串必须以这个正则表达式的模式结束 |
2.5通配符
.(句号)字符称为通配符,匹配除了换行之外所有字符,它只匹配一个字符
.* | 匹配任意文本,贪心模式 |
---|---|
.*? | 匹配任意文本,非贪心模式 |
通过传入 re.DOTALL 作为 re.compile()的第二个参数, 可以让句点字符匹配所有字符, 包括换行字符
newlineRegex = re.compile('.*', re.DOTALL)
newlineRegex.search('Serve the public trust.\nProtect the innocent.
\nUphold the law.').group()
2.6 不区分大小写的匹配
向re.compile()传入re.I,作为第二个参数
ro = re.compile(r'robocop',re.I)
2.7 用sub()方法替换字符串
sub()方法需要传入两个参数。第一个参数是一个字符串, 用于取代发现的匹配。第二个参数是一个字符串,即正则表达式。 sub()方法返回替换完成后的字符串。
#!/usr/bin/python3
import re
namesRegex = re.compile(r'Agent \w+')
print(namesRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob.'))
2.8 管理复杂的正则表达式
匹配复杂的文本模式可以告诉 re.compile(), 忽略正则表达式字符串中的空白符和注释, 从而缓解这一点。 要实现这种详细模式, 可以向 re.compile()传入变量re.VERBOSE, 作为第二个参数。
这样可以将正则表达式放在多行中, 并加上注释。
phoneRegex = re.compile(r'''(
(\d{3}|\(\d{3}\))? # area code
(\s|-|\.)? # separator
\d{3} # first 3 digits
(\s|-|\.) # separator
\d{4} # last 4 digits
(\s*(ext|x|ext.)\s*\d{2,5})? # extension
)''', re.VERBOSE)