如何使用 python 正则表达式替换使用捕获的组? [复制]

Posted

技术标签:

【中文标题】如何使用 python 正则表达式替换使用捕获的组? [复制]【英文标题】:How to use python regex to replace using captured group? [duplicate] 【发布时间】:2011-10-06 09:30:00 【问题描述】:

假设我想将the blue dog and blue cat wore blue hats 更改为the gray dog and gray cat wore blue hats

使用sed 我可以按如下方式完成:

$ echo 'the blue dog and blue cat wore blue hats' | sed 's/blue \(dog\|cat\)/gray \1/g'

如何在 Python 中进行类似的替换?我试过了:

>>> import re
>>> s = "the blue dog and blue cat wore blue hats"
>>> p = re.compile(r"blue (dog|cat)")
>>> p.sub('gray \1',s)
'the gray \x01 and gray \x01 wore blue hats'

【问题讨论】:

【参考方案1】:

你需要转义你的反斜杠:

p.sub('gray \\1', s)

或者,您可以像对正则表达式一样使用原始字符串:

p.sub(r'gray \1', s)

【讨论】:

第二个答案是理想的,因为它符合sed 语法。 一个衬里是 re.sub("blue (dog|cat)", "gray \\1", s);【参考方案2】:

当我在寻找类似的答案时;但想在替换中使用命名组,我想我会为其他人添加代码:

p = re.compile(r'blue (?P<animal>dog|cat)')
p.sub(r'gray \g<animal>',s)

【讨论】:

【参考方案3】:

题外话, 对于编号的捕获组:

#/usr/bin/env python
import re

re.sub(
    pattern=r'(\d)(\w+)', 
    repl='word: \\2, digit: \\1', 
    string='1asdf'
)

word: asdf, digit: 1

Python 使用文字反斜杠和从 1 开始的索引来执行编号的捕获组替换,如本示例所示。所以\1,输入为'\\1',引用第一个捕获组(\d)\2是第二个捕获组。

【讨论】:

离题,但我想知道是否可以替换捕获的组,在你的情况下,group11 我们可以替换 group1 让我们说 5 所以最后输出可以类似于5asdf。 (即替换整个组) @anoop 如果我理解您的目标,听起来您根本不想捕获1,在这种情况下,根本不捕获它(不要将其括在括号中)。如果您想使用正则表达式提取字符串,请使用re.matchre.search(和变体),这将为您提供例如组字典(docs.python.org/3/library/re.html#re.Match.groupdict),您可以根据需要格式化/解析数据跨度> @anoop 哦,您也可以简单地不使用捕获组(或根本不捕获它)并将更多日期硬编码到您的输出字符串中,必须像“word:'和'这样的词, digit: ' 在示例中。 好的,让我用一个例子来解释一下,我的文本类似于function public xyzname(),我想将public 更改为private,所以只有将function 和@ 分组才能做到这一点987654340@ 并应用\\1 private \\2 之类的东西,但我想知道我是否可以将public 分组为group 1 并将其替换为private,这可能吗? @anoop 确定这种转换在正则表达式用例中很常见,你的问题在正确的轨道上,当你应用 \\1 private \\2 并调整时,试试看它是如何工作的根据需要【参考方案4】:

试试这个:

p.sub('gray \g<1>',s)

【讨论】:

不错的选择 (+1) 但它仍然有效,只是因为 \g 不是有效的转义码。编写代码的安全方式仍然应该是:p.sub('gray \\g&lt;1&gt;',s) 对不起,我的意思是这是一个原始字符串。我也省略了替换参数——我很高兴!我正在删除评论。我 100% 同意不要指望 Python 在转义序列方面过于宽松的行为。 @mac 考虑将您的评论添加到您的答案中。它是 ipython notebook 中唯一可靠工作的东西。 @mac: \g 被选中,特别是与其他转义码冲突。如果是这样,Python 开发人员将是一个糟糕的选择。 docs.python.org/2/library/re.html#re.sub 你可以写p.sub(r'gray \g&lt;1&gt;',s)来防止``被Python解析,让它直接发送到正则表达式引擎。

以上是关于如何使用 python 正则表达式替换使用捕获的组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Postgres regexp_replace:无法用第一个捕获的组替换源文本

在正则表达式的可选部分中捕获的组

如何在记事本++替换中分隔正则表达式组号?

java正则表达式匹配IP地址和端口号作为捕获的组

如何用另一个文件中的组(已知正则表达式)替换一个文件中的空白空间?

正则表达式进阶