在Python中使用正则表达式进行替换时如何访问匹配的子字符串。

4
我希望能够匹配两个正则表达式A和B,它们一起出现的形式为“AB”。然后我想在A和B之间插入一个空格,使其变为“A B”。
例如,如果A = [0-9],B = !+,我想做以下操作。
match = re.sub('[0-9]!+', '[0-9] !+', input_string)

但是,显然这样做无效,因为这将把任何匹配项替换为字符串“[0-9] !+”。
如何在正则表达式中实现这一点(最好在一行内完成)?还是需要多个繁琐的步骤吗?
2个回答

8

使用分组!

match = re.sub('([0-9])(!+)', r'\1 \2', input_string);

\1\2 表示第一个和第二个带括号的片段。前缀 r 用于保留 \ 字符。


0
假设输入字符串为"我有5G网络",但您想要在5G之间添加空格,即无论何时出现像G20AK47这样的表达式,您都希望将数字和字母分开(我有5 G网络)。在这种情况下,您需要使用另一个正则表达式替换正则表达式。类似于这样:re.sub(r'\w\d',r'\w \d',input_string)。但是这样做行不通,因为替换字符串不会保留第一个正则表达式捕获的字符串。
解决方案:通过访问正则表达式替换中的组来轻松地解决此问题。如果要向识别的组添加内容,则此方法将非常有效。 re.sub(r"(\..*$)",r"_BACK\1","my_file.jpg")re.sub(r'(\d+)',r'<num>\1</num>',"I have 25 cents")

您可以使用此方法通过捕获两个组而不是一个来解决您的问题。

re.sub(r"([A-Z])(\d)",r"\1 \2",input_string)

另一种方法是使用lambda函数

re.sub(r"(\w\d)",lambda d: d.group(0)[0]+' '+d.group(0)[1],input_string)

另一种方法是使用前瞻:

re.sub(r"(?<=[A-Z])(?=\d)",r" ",input_string)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接