正则表达式中元字符、反斜杠的作用及反向引用替换疑问
正则表达式元字符与反向引用疑问解答
先把你贴的代码放在这里方便参考:
import re pattern = r"(.+) \1" match = re.match(pattern, "word word") if match: print ("Match 1") match = re.match(pattern, "?! ?!") if match: print ("Match 2") match = re.match(pattern, "abc cde") if match: print ("Match 3")
逐个拆解你的疑问
1. (.+) 到底是干嘛的?
这个是正则里的捕获组用法,拆开来理解:
.是万能匹配元字符,能匹配除换行外的任意单个字符;+是限定符,要求前面的元素(也就是这里的.)至少出现1次,所以.+就是匹配一段长度≥1的任意字符序列;- 外面的括号
()是关键,它把.+标记为一个「捕获组」——正则引擎会把这个组匹配到的内容临时存起来,后面可以直接调用它。
2. 这里的反斜杠有啥用?
这里的反斜杠分两部分说:
- 字符串开头的
r代表原始字符串,在原始字符串里,反斜杠不会被Python当作转义字符处理。要是不用r,你得把\1写成\\1(因为普通字符串里\是转义符,要输出一个实际的反斜杠得写两个),用r能让正则表达式的写法更直观,不用额外加转义。 - 正则里的
\1是反向引用,它直接引用第一个捕获组(就是前面(.+))匹配到的内容。简单说就是:先匹配一段任意字符,然后跟一个空格,再跟一段和刚才完全一样的字符,才算匹配成功。
3. 把 \1 换成 \2 会输出啥?
结论是:啥都不会输出。
因为你的正则里只有一个捕获组 (.+),\2 是用来引用第二个捕获组的,但这里根本不存在第二个组。正则引擎找不到对应的组,整个模式就失效了,三个测试用例都匹配不上,自然不会打印任何 Match 信息。
顺便帮你理下原代码的输出逻辑
原代码运行后会打印 Match 1 和 Match 2:
- 第一个测试用例 "word word":
(.+)匹配第一个 "word",\1匹配后面的 "word",完全吻合,触发Match 1; - 第二个测试用例 "?! ?!":
(.+)匹配第一个 "?!",\1匹配后面的 "?!",也吻合,触发Match 2; - 第三个测试用例 "abc cde":
(.+)匹配 "abc",但后面的是 "cde",和捕获组内容不一样,不匹配,所以不会打印Match 3。
内容的提问来源于stack exchange,提问作者H. Garg




