【问题标题】:Is there a way to use regular expressions in the replacement string in re.sub() in Python?有没有办法在 Python 的 re.sub() 中的替换字符串中使用正则表达式?
【发布时间】:2014-09-14 22:15:27
【问题描述】:

在 Python 中的 re 模块中有以下函数:

re.sub(pattern, repl, string, count=0, flags=0) – 返回通过替换 repl 替换 string 中最左边不重叠的 pattern 获得的字符串。如果未找到该模式,则字符串原样返回。

我发现它可以这样工作:

print re.sub('[a-z]*\d+','lion','zebra432') # prints 'lion'

我想知道,有没有一种简单的方法可以在替换字符串中使用正则表达式,以便替换字符串包含原始正则表达式/原始字符串的一部分?具体来说,我可以做这样的事情(这不起作用)吗?

print re.sub('[a-z]*\d+', 'lion\d+', 'zebra432')

我想打印'lion432'。显然,事实并非如此。相反,它打印'lion\d+'。有没有一种简单的方法可以在替换字符串中使用部分匹配的正则表达式?

顺便说一句,这不是特例。请不要假设数字总是在末尾,单词总是在开头,等等。我想知道一般所有正则表达式的解决方案。

谢谢

【问题讨论】:

    标签: python regex string replace substring


    【解决方案1】:

    \d+ 放在捕获组(...) 中,然后使用\1 引用它:

    >>> import re
    >>> re.sub('[a-z]*(\d+)', r'lion\1', 'zebra432')
    'lion432'
    >>>
    >>> # You can also refer to more than one capture group
    >>> re.sub('([a-z]*)(\d+)', r'\1lion\2', 'zebra432')
    'zebralion432'
    >>>
    

    来自docs

    反向引用,例如\6,被替换为匹配的子字符串 在模式中按组6

    请注意,您还需要使用raw-string,以便\1 不会被视为转义序列。

    【讨论】:

    • 不应该将原始字符串用于正则表达式(第一个字符串)吗?
    • @DavidZwicker - 可能。但这里并不是绝对必要的。
    • 斑马几乎是我最喜欢的动物。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多