我希望匹配两个正则表达式A和B,其中A和B显示为' AB'。我想在A和B之间插入一个空格,以便它成为A B'。
例如,如果A = [0-9]且B =!+,我想做类似以下的事情。
match = re.sub('[0-9]!+', '[0-9] !+', input_string)
但是,这显然不起作用,因为这会用字符串替换任何匹配项[0-9]!+'。
如何在正则表达式中执行此操作(最好在一行中)?或者这需要几个繁琐的步骤?
答案 0 :(得分:8)
使用群组!
match = re.sub('([0-9])(!+)', r'\1 \2', input_string);
\1
和\2
表示第一个和第二个带括号的片段。前缀r
用于保持\
字符的完整。
答案 1 :(得分:0)
假设输入字符串是 "I have 5G network"
,但您希望在 5
和 G
之间有空格,即每当有 G20
或 AK47
之类的表达式时,您想要分隔数字和字母 (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)