为何正则表达式中单词边界需用双反斜杠,其他表达式可用单反斜杠?
为什么Python正则中\s能用单斜杠,\b却需要双斜杠?
这问题其实核心在于Python字符串本身的转义机制和正则表达式引擎的转义规则之间的冲突,我来给你掰扯清楚:
先搞懂Python字符串的转义优先级:Python在把字符串传递给re模块之前,会先解析字符串里的反斜杠序列。比如:
"\b"在Python眼里不是\加b,而是一个退格字符(ASCII 0x08),当你把这个传给re模块时,它自然识别不了这是单词边界的标记,所以匹配失败。- 而
"\s"就不一样了:Python字符串里没有\s对应的预定义转义字符,所以Python会直接把\和s这两个字符原封不动传给re模块,而re模块正好认识\s是匹配空白字符的规则,所以就生效了。
那怎么让
\b被正则引擎正确识别?有两个常用办法:- 用双反斜杠转义:
"\\b"里的第一个反斜杠是用来告诉Python“后面的反斜杠是普通字符,别转义它”,所以Python解析后会得到\b,传给re模块就会被识别成单词边界。 - 用原始字符串(推荐):在字符串前面加
r,比如r"\bfox"。原始字符串会告诉Python“别碰这里面的任何转义序列,直接原封不动传出去”,这样re模块就能拿到纯纯的\b,效果和双反斜杠一样,但写起来更清爽。
- 用双反斜杠转义:
给你补个包含原始字符串的示例代码,看得更清楚:
import re def searchResult(expr, inputStr): if re.search(expr, inputStr): return True return False print(searchResult("\s", "the quick brown fox")) # True,Python没转义\s,re识别为空白符 print(searchResult("\bfox", "the quick brown fox")) # False,Python把\b转成了退格符 print(searchResult("\\bfox", "the quick brown fox")) # True,双反斜杠让re拿到了\b print(searchResult(r"\bfox", "the quick brown fox")) # True,原始字符串直接传递\b
内容的提问来源于stack exchange,提问作者sdMarth
相关产品推荐
相关产品推荐

