You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

正则表达式中元字符、反斜杠的作用及反向引用替换疑问

正则表达式元字符与反向引用疑问解答

先把你贴的代码放在这里方便参考:

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 1Match 2

  • 第一个测试用例 "word word":(.+) 匹配第一个 "word",\1 匹配后面的 "word",完全吻合,触发 Match 1
  • 第二个测试用例 "?! ?!":(.+) 匹配第一个 "?!",\1 匹配后面的 "?!",也吻合,触发 Match 2
  • 第三个测试用例 "abc cde":(.+) 匹配 "abc",但后面的是 "cde",和捕获组内容不一样,不匹配,所以不会打印 Match 3

内容的提问来源于stack exchange,提问作者H. Garg

火山引擎 最新活动