给出以下字符串:
text = "hello world pattern 24 4 5 this is an example pattern 4 3 11 "
我需要用“ patternX-Y-Z”替换“ pattern X Y Z”,其中X,Y,Z是数字(“ pattern”和第一个数字之间没有空格)。 到目前为止,我正在通过此正则表达式进行此操作:
text= re.sub('pattern\s(\d+)\s(\d+)\s(\d+)', r'pattern\1-\2-\3', text).strip()
假设我有三个以上的组(类似“模式12 3 5 7 5和模式34 5 4”),其中组的数量不是固定的,并且未知先验,我该如何写我的正则表达式? 有没有办法写一个递归的正则表达式来代替?
答案 0 :(得分:1)
您可以使用
import re
rx = r'(pattern)(\s*[\d\s]*\d)\b'
s = 'hello world pattern 24 4 5 this is an example pattern 4 3 11 6th oct 2018 pattern 4 3 11 124 2'
print(re.sub(rx, lambda x: "{}{}".format(x.group(1), "-".join(x.group(2).split())), s))
# => hello world pattern24-4-5 this is an example pattern4-3-11 6th oct 2018 pattern4-3-11-124-2
请参见Python demo
(pattern)(\s*[\d\s]*\d)\b
匹配
(pattern)
-pattern
进入第1组(\s*[\d\s]*\d)
-(第2组)0+个空格,然后是0+个数字和空格,最后是一个数字\b
-单词边界替换时,将组1的值放在替换的开头,将组2的值用空格分开,并用-
合并。