python re.sub group: \number 之后的数字

发布于 2024-11-06 11:40:12 字数 252 浏览 0 评论 0原文

如何用 foo123bar 替换 foobar

这不起作用:

>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'

这起作用:

>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'

How can I replace foobar with foo123bar?

This doesn't work:

>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'

This works:

>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

揽清风入怀 2024-11-13 11:40:12

答案是:

re.sub(r'(foo)', r'\g<1>123', 'foobar')

文档的相关摘录:

除了如上所述的字符转义和反向引用之外,\g 将使用名为 name 的组匹配的子字符串,如 所定义>(?P...) 语法。 \g 使用对应的组号;因此,\g<2> 等同于 \2,但在 \g<2>0 等替换中并不含糊。 \20 将被解释为对组 20 的引用,而不是对组 2 的引用,后跟文字字符 '0'。反向引用 \g<0> 替换 RE 匹配的整个子字符串。

The answer is:

re.sub(r'(foo)', r'\g<1>123', 'foobar')

Relevant excerpt from the docs:

In addition to character escapes and backreferences as described above, \g<name> will use the substring matched by the group named name, as defined by the (?P<name>...) syntax. \g<number> uses the corresponding group number; \g<2> is therefore equivalent to \2, but isn’t ambiguous in a replacement such as \g<2>0. \20 would be interpreted as a reference to group 20, not a reference to group 2 followed by the literal character '0'. The backreference \g<0> substitutes in the entire substring matched by the RE.

-残月青衣踏尘吟 2024-11-13 11:40:12

对于这个问题,我更愿意通过使用以下内容来匹配而不是捕获。

re.sub(r'(?<=foo)', r'123', 'foobar')
  #=> 'foo123bar'

'foo' 之后的零宽度字符串(考虑 'foo''bar')替换为 '123'(?<=foo) 是一个正向回顾

Demo


当然也有需要捕获组的情况,比如

re.sub(r'(f\w*o)', r'\g<1>123', 'foobar')

Here

re.sub(r'(?<=f\w*o)', r'123', 'foobar')

不起作用,因为Python 的默认正则表达式引擎不支持可变长度后向查找(但是替代的 PyPI 正则表达式模块 支持) 。

For this problem I would prefer to match but not capture, by employing the following.

re.sub(r'(?<=foo)', r'123', 'foobar')
  #=> 'foo123bar'

which replaces the zero-width string after 'foo' (think between 'foo' and 'bar') with '123'. (?<=foo) is a positive lookbehind.

Demo


There are of course situations where a capture group is needed, such as

re.sub(r'(f\w*o)', r'\g<1>123', 'foobar')

Here

re.sub(r'(?<=f\w*o)', r'123', 'foobar')

does not work because Python's default regex engine does not support variable-length lookbehinds (the alternative PyPI regex module does, however).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文