先验数目的未知组的替换-regex python

时间:2018-10-05 13:46:44

标签: python regex recursion

给出以下字符串:

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”),其中组的数量不是固定的,并且未知先验,我该如何写我的正则表达式? 有没有办法写一个递归的正则表达式来代替?

1 个答案:

答案 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的值用空格分开,并用-合并。