在re
模块的Python中,有以下功能:
re.sub(pattern,repl,string,count = 0,flags = 0) - 返回通过替换repl替换字符串中最左边非重叠模式而获得的字符串。如果找不到模式,则返回字符串不变。
我发现它可以像这样工作:
print re.sub('[a-z]*\d+','lion','zebra432') # prints 'lion'
我想知道,是否有一种简单的方法可以在替换字符串中使用正则表达式,以便替换字符串包含原始正则表达式/原始字符串的一部分?具体来说,我可以做这样的事情(这不起作用)吗?
print re.sub('[a-z]*\d+', 'lion\d+', 'zebra432')
我想要打印'lion432'
。显然,它没有。而是打印'lion\d+'
。有没有一种简单的方法可以在替换字符串中使用匹配正则表达式的部分?
顺便说一句,这不是特例。请不要认为数字总是在最后,单词总是在开头,等等。我想知道一般的所有正则表达式的解决方案。
由于
答案 0 :(得分:8)
将\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
不被视为转义序列。