如何使用 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
是第二个捕获组。
【讨论】:
离题,但我想知道是否可以替换捕获的组,在你的情况下,group1
是 1
我们可以替换 group1
让我们说 5
所以最后输出可以类似于5asdf
。 (即替换整个组)
@anoop 如果我理解您的目标,听起来您根本不想捕获1
,在这种情况下,根本不捕获它(不要将其括在括号中)。如果您想使用正则表达式提取字符串,请使用re.match
或re.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<1>',s)
对不起,我的意思是这是一个原始字符串。我也省略了替换参数——我很高兴!我正在删除评论。我 100% 同意不要指望 Python 在转义序列方面过于宽松的行为。
@mac 考虑将您的评论添加到您的答案中。它是 ipython notebook 中唯一可靠工作的东西。
@mac: \g
被选中,特别是不与其他转义码冲突。如果是这样,Python 开发人员将是一个糟糕的选择。 docs.python.org/2/library/re.html#re.sub
你可以写p.sub(r'gray \g<1>',s)
来防止``被Python解析,让它直接发送到正则表达式引擎。以上是关于如何使用 python 正则表达式替换使用捕获的组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Postgres regexp_replace:无法用第一个捕获的组替换源文本