Python正则断言用于在匹配文本时判断目标内容的前后是否符合指定条件,不需要将条件内容纳入最终的匹配结果,是处理复杂匹配需求的重要工具,主要分为前瞻断言和后顾断言两大类。
正则断言的基本分类
正则断言按照判断方向可以分为前瞻和后顾,按照判断逻辑可以分为正向和负向,组合起来共有四种类型,具体对应关系如下:
| 断言类型 | 语法格式 | 含义 |
|---|---|---|
| 正向前瞻断言 | (?=pattern) | 目标内容后面必须匹配pattern |
| 负向前瞻断言 | (?!pattern) | 目标内容后面不能匹配pattern |
| 正向后顾断言 | (?<=pattern) | 目标内容前面必须匹配pattern |
| 负向后顾断言 | (?<!pattern) | 目标内容前面不能匹配pattern |
前瞻断言的使用方法
前瞻断言用于判断目标内容的右侧是否符合条件,不会消耗匹配的字符,适合需要匹配后面跟着特定内容的场景。
正向前瞻断言示例
比如我们需要匹配后面跟着数字的价格数值,不需要把数字部分纳入结果:
import re text = "商品A价格100元,商品B价格200元" # 匹配后面跟着数字的连续数字,即价格数值 pattern = r"d+(?=d)" result = re.findall(pattern, text) print(result) # 输出 ['10', '20']
负向前瞻断言示例
如果需要匹配后面不是数字的小写字母:
import re text = "abc123 def456 ghi" # 匹配后面不是数字的小写字母 pattern = r"[a-z]+(?!d)" result = re.findall(pattern, text) print(result) # 输出 ['ghi']
后顾断言的使用方法
后顾断言用于判断目标内容的左侧是否符合条件,同样不会消耗匹配的字符,适合需要匹配前面有特定内容的场景。
正向后顾断言示例
比如我们需要匹配前面是货币符号的金额数值:
import re text = "总价¥150,运费$20" # 匹配前面是¥或$的连续数字 pattern = r"(?<=[¥$])d+" result = re.findall(pattern, text) print(result) # 输出 ['150', '20']
负向后顾断言示例
如果需要匹配前面不是数字的小写字母:
import re text = "123abc 456def ghijk" # 匹配前面不是数字的小写字母串 pattern = r"(?<!d)[a-z]+" result = re.findall(pattern, text) print(result) # 输出 ['ghijk']
断言使用的注意事项
- 后顾断言中的pattern必须是固定长度的,不能使用
*、+等不定长度的量词,否则会抛出语法错误 - 断言本身不会作为匹配结果的一部分返回,只会作为匹配的条件判断
- 多个断言可以组合使用,比如同时判断前后都符合条件的内容
组合断言的示例,匹配前后都是小写字母的数字:
import re text = "abc123def 456ghi 789" # 匹配前后都是小写字母的数字串 pattern = r"(?<=[a-z])d+(?=[a-z])" result = re.findall(pattern, text) print(result) # 输出 ['123']