在Python的正则表达式规则里,竖线|是一个具有特殊功能的元字符,它的默认作用是匹配其左右两侧的表达式中的任意一个,属于选择匹配的逻辑。如果我们需要匹配字符串中真实的|字符,就需要对其进行转义处理,否则正则引擎会把它当作选择逻辑来解析,导致匹配结果不符合预期。

|的默认作用示例
我们先来看不转义|时的匹配效果,下面的代码会匹配字符串中出现的apple或者banana:
import re # 不转义的|表示选择匹配 pattern = re.compile(r'apple|banana') test_str = 'I like apple and banana' result = pattern.findall(test_str) print(result) # 输出 ['apple', 'banana']
方式一:使用反斜杠转义
如果我们需要匹配字面量的|,只需要在|前面加上一个反斜杠,让正则引擎将其识别为普通字符即可:
import re # 转义的|表示匹配字面量| pattern = re.compile(r'|') test_str = 'a|b|c' result = pattern.findall(test_str) print(result) # 输出 ['|', '|']
这里需要注意,我们在正则表达式字符串前面加了r前缀,这是原始字符串标记,避免Python先对反斜杠进行转义,保证正则引擎能正确接收到转义符号。
方式二:使用re.escape函数
如果不确定哪些字符需要转义,或者需要批量处理包含特殊字符的字符串,可以使用re模块提供的re.escape函数,它会自动对字符串中的所有正则特殊字符进行转义:
import re # re.escape自动转义特殊字符 raw_str = 'a|b' escaped_str = re.escape(raw_str) print(escaped_str) # 输出 a|b pattern = re.compile(escaped_str) test_str = 'a|b|c' result = pattern.findall(test_str) print(result) # 输出 ['a|b']
两种方式的适用场景
如果是明确只需要转义|这一个字符,使用反斜杠转义的方式更简洁,代码可读性也更高。如果是处理用户输入的动态字符串,里面可能包含多个正则特殊字符,使用re.escape函数会更安全,避免遗漏转义其他特殊字符导致正则语法错误或者匹配异常。
注意事项
- 不要忘记在正则表达式字符串前加r前缀,否则Python会把|解析为|,导致转义失效。
- re.escape函数转义后的字符串可以直接用于正则匹配,不需要再手动添加其他转义符号。
- 如果是在字符集[]内部,|不需要转义,会被当作普通字符处理,比如[|]就可以匹配字面量|。
import re # 字符集内的|不需要转义 pattern = re.compile(r'[|]') test_str = 'a|b' result = pattern.findall(test_str) print(result) # 输出 ['|', '|']