学习自《python编程快速上手——让繁琐的工作自动化》

前置知识

关于正则表达式

正则表达式可以在文本中快速查找或修改某一类文本

也是爬虫等等技术的前置知识中重要的一个部分

正则表达式基本操作

1
2
3
4
5
import re #导入正则表达式的库

phoneNumRegex = re.compile(r'\d\d\d-\d\d\d\d') #创建正则表达式(Regex)对象
mo = phoneNumRegex.search('My number is 415-555-4242.') #使用Regex对象的search()方法查找文本,返回Match对象
print('Phone number found: ' + mo.group()) #使用Match对象的group()方法打印结果

正则表达式

正则表达式符号速查

符号 作用 备注
\d 匹配一个数字
() 分组 可以用\来转义()
| 匹配多个分组
? 实现可选匹配
* 匹配零次或一次
+ 匹配一次或多次
{} 匹配特定次数
\D 匹配0-9以外的任何字符
\w 匹配字母数字下划线
\W 匹配任何字母数字下划线以外的字符
\s 匹配空格制表换行符
\S 匹配任何空格制表换行符以外的字符
^ 用在开头,匹配以这个开头的字符串 例如^hello匹配以hello开头的字符串
$$` 用在结尾,匹配以这个结尾的字符串 例如`\d$$匹配以数字结尾的字符串
. 通配符,匹配除了换行之外的所有字符
.* 匹配所有字符 注1贪心和非贪心
[abc] 匹配括号内的任意字符 例如[aeiouAeiou]匹配所有元音字母

正则表达式常用方法

方法 作用 备注
Match.group(1) 获取分组 0表示整个文本,1表示第一个分组
Match.groups() 获取所有分组
Regex.search() 查找第一次匹配的文本,返回Match对象
Regex.findall() 查找所有匹配的文本,返回字符串列表
Regex.sub(str1, str2) 把str2中匹配的文本替换为str1 注2

正则表达式常用参数

参数 作用 备注
re.DOTALL .匹配所有字符,包括换行符 re.compile()的参数
re.IGNORECASEre.I 忽略大小写 re.compile()的参数
re.VERBOSE 忽略空白和注释 注3

其它

注1:贪心和非贪心匹配

python正则表达式默认贪心的,在有二义性时,尽量匹配更长的字符串,例如在hahahahaha时,ha{3, 5}匹配hahahahaha

{}后跟?使其变成非贪心的,在有二义性时,尽量匹配更短的字符串,例如在hahahahaha时,ha{3, 5}?匹配hahaha

注2:可以用匹配文本的一部分替换文本本身

1
2
3
4
5
6
7
8
9
# 直接用其它文本替换匹配文本
nameRegex = re.compile(r'Agent \w+')
nameRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob.')
# 结果是CENSORED Alice gave the secret documents to Agent Bob.

# 用匹配文本一部分替换匹配文本本身
agentNameRegex = re.compile(r'Agent (\w)\w*')
agentNameRegex.sub(r'\1****', 'Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.')
# 结果是 A**** told C**** that E**** knew B**** was a doubel agent.

注3:忽略空白和注释

1
2
3
4
5
6
7
8
phoneRegex = re.compile(r'''(
(\d{3}|\(\d{3}))? #area code
(\s|-|\.)? #sparator
\d{3} #first 3 digits
(\s|-|\.) #separator
\d{4} #last 4 digits
(\s*(ext|x|ext.)\s*\d{2,5})? #extension
)''', re.VERBOSE)