正则表达式

1 概念理解

正则表达式(Regular Expression,简写为regex、或RE)是一种描述句法规则的字符串,常用来匹配符合某个模式(pattern)的文本,以实现针对特定文本的检索(search,findall)、替换(replace)等目的。

常见应用:文本/文件查找、数据/网页清洗、非格式化数据转格式化

在线测试:https://www.mklab.cn/utils/regex

2 正则入门

正则表达式30分钟入门教程

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 填字游戏

正则表达式填字游戏网格(参考):

往年同期文章