1 概念理解
正则表达式(Regular Expression,简写为regex、或RE)是一种描述句法规则的字符串,常用来匹配符合某个模式(pattern)的文本,以实现针对特定文本的检索(search,findall)、替换(replace)等目的。
常见应用:文本/文件查找、数据/网页清洗、非格式化数据转格式化
在线测试:https://www.mklab.cn/utils/regex
2 正则入门
3 常用技巧
3.1 手册速查
3.2 多模式组合-或与非
规则含义 | 正则文本 | |
---|---|---|
伴随头晕的过敏 | '^(?=.*头晕).*(过敏)' | |
伴随头晕且头疼的过敏 | '^(?=.*头晕)(?=.*头疼).*(过敏)' | |
伴随头晕或头疼的过敏 | '^(?=.*[头晕|头疼]).*(过敏)' | |
不伴随头晕的过敏 | '^(?!.*头晕).*(过敏)' | |
不伴随头晕或头疼的过敏 | ^(?!.*[头疼|头晕]).*(过敏)' | |
伴随头晕但不伴随头疼的过敏 | '^(?=.*头晕)(?!.*头疼).*(过敏)' |
4 在Python中使用
import re
# match匹配示例:匹配出0-99之间的数字
ret = re.match("[1-9]?[1-9]","779")
print(ret.group())
# search查找示例:提取图片的url
data = """
<img data-original="https://rpic.douyucdn.cn/appCovers/2016/1
1/13/1213973_201611131917_small.jpg"
src="https://rpic.douyuc dn.cn/appCovers/2016/11/13/1213973_201611131917_small.jpg"
style="display:inline;">
"""
ret = re.search(r"https.+?\.jpg",data)
print(ret.group())
# findall查找所有示例:统计(所有出现的)数字
ret = re.findall(r"\d+","python = 2342,c = 7980,java = 9999")
print(ret)
# sub替换示例:网页清洗
data = """
<div>
<p>岗位职责:</p>
<p>完成推荐算法、数据统计、接⼝、后台等服务器端相关⼯作</p>
</div>
"""
ret = re.sub(r"<.+?>","",data)
print(ret)
# 使用compile方便正则的重复使用
text = """Dave [email protected]
Steve [email protected]"""
pattern = r"[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}" # 匹配邮箱
regex = re.compile(pattern, flags=re.IGNORECASE) # re.IGNORECASE表示匹配时忽略大小写
regex.findall(text)
regex.match(text)
regex.sub("REDACTED", text)
为了避免不必要的转义,可使用
r
作为需要处理字符串的前缀实现文本替换的另一种方法
subn
,可指定只对前n次进行替换
区分match与search
- search是遍历字符串,找到第一个匹配成功后的结果
- match从字符串开始位置进行匹配判断,匹配成功则返回相应结果
更多细节可参阅:re模块
5 正则进阶
6 填字游戏
正则表达式填字游戏网格(参考):