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

时间:2012-01-21 19:05:12

标签: python regex

我希望匹配两个正则表达式A和B,其中A和B显示为' AB'。我想在A和B之间插入一个空格,以便它成为A B'。

例如,如果A = [0-9]且B =!+,我想做类似以下的事情。

match = re.sub('[0-9]!+', '[0-9] !+', input_string)

但是,这显然不起作用,因为这会用字符串替换任何匹配项[0-9]!+'。

如何在正则表达式中执行此操作(最好在一行中)?或者这需要几个繁琐的步骤?

2 个答案:

答案 0 :(得分:8)

使用群组!

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

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

答案 1 :(得分:0)

假设输入字符串是 "I have 5G network",但您希望在 5G 之间有空格,即每当有 G20AK47 之类的表达式时,您想要分隔数字和字母 (I have 5 G network)。在这种情况下,您需要用另一个正则表达式替换一个正则表达式。像这样:

re.sub(r'\w\d',r'\w \d',input_string)

但这不起作用,因为替换字符串不会保留第一个正则表达式捕获的字符串。

解决方案:

它可以通过访问正则表达式替换中的组来 easily solved。如果您想向已发现的组添加一些内容,此方法将很有效。

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)

另一种方法是通过using lambda functions

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)