【问题标题】:Python 2.7 Regex capture groups not working as predictedPython 2.7 正则表达式捕获组未按预期工作
【发布时间】:2016-04-06 10:09:54
【问题描述】:

我正在尝试使用 Python 2.7 进行模式匹配并将第一人称替换为第二人称。

string = re.sub(r'(\W)I(\W)', '\g<1>you\g<2>',string)
string = re.sub(r'(\W)(me)(\W)', '\g<1>you\g<3>',string)
# but does NOT work
string = re.sub(r'(\W)I|(me)(\W)', '\g<1>you\g<3>',string)

我想使用最后一个正则表达式,但不知何故,捕获组都搞砸了,甚至执行 \g 会显示奇怪的不规则匹配。我认为捕获组 3 将是最后一个单词边界,但它似乎不是。

例句可能是:I like candy.

我对替换的正确性不是很感兴趣(我永远不会被选中,因为我是第一个),但我不知道为什么捕获组没有按我的预期工作。

谢谢!

【问题讨论】:

  • 什么是 Python 版本,顺便说一句?
  • 2.7!我会补充问题。
  • 那么,第三种模式至少有两个问题:错误的交替边界和不参与的组替换。你没有收到"unmatched group" 错误吗?
  • 我正在查看您的答案,并将投票赞成原始线程。非常感谢!
  • @noob:我宁愿称其为“优化”方法 :)

标签: python regex python-2.7


【解决方案1】:

尝试使用以下正则表达式。

正则表达式: \b(I|me)\b

说明:

  • \b两边都是字边界。

  • (I|me) 匹配 Ime

注意:-您可以使用i 标志使其不区分大小写。

Regex101 Demo

【讨论】:

  • 这是一个更好的答案。但是你知道为什么交替似乎搞乱了捕获组,以至于捕获组 3 不再是我所期望的吗?
  • @NickAnderson:由于您使用\W 而不是单词边界,因此当I 位于字符串开头时它会失败。 (\W)(me)|I(\W) 也可以使用 Demo 但使用单词边界更安全。
  • 这是真的。但是比较: string = re.sub(r'(\W)I|(me)(\W)', '\gyou\g',string) 和 string = re.sub(r '(\W)(I|me)(\W)', '\gyou\g',string),为什么组不同?为什么将捕获组嵌套在交替运算符下会改变它的工作方式?我在 Python 文档中看到您也可以使用 来引用嵌套级别,那么含义会根据上下文而改变吗?
  • 这与捕获组无关。即使您不在me 周围使用它,它也会起作用。您将不得不用于对所有更改案例进行分组。 (I|me).
  • 谢谢;这很有帮助!
猜你喜欢
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2014-04-28
  • 2022-01-02
相关资源
最近更新 更多