Python regex匹配一个模式多次



我有一个字符串列表。

input=['XX=BB|3|3|1|1|PLP|KLWE|9999|9999', 'XX=BB|3|3|1|1|2|PLP|KPOK|99999|99999', '999|999|999|9999|999', ....]

这种类型的'999|999|999|9999|999'保持不变。

我需要用12|21代替9999|9999

我写这个(?<=BB|d|d|d|d|S{3}|S{4}|)9{2,9}|9{2,9}来匹配999|999。但是,中间有4 ~ 6个|d。那么如何匹配|d这个模式多次。

预期的结果:

['XX=BB|3|3|1|1|PLP|KLWE|12|21', 'XX=BB|3|3|1|1|2|PLP|KPOK|12|21', '999|999|999|9999|999'...]

感谢

可以使用

re.sub(r'(BB(?:|d){4,6}|[^s|]{3}|[^s|]{4}|)9{2,9}|9{2,9}(?!d)', r'g<1>12|21', text)

参见regex演示。

细节:

  • (BB(?:|d){4,6}|[^s|]{3}|[^s|]{4}|)-捕获组1:
    • BB- aBBstring
    • (?:|d){4,6}-|和任意数字序列的四、五或六次重复
    • |- a|char
    • [^s|]{3}-除空格外的三个字符和一个管道
    • |[^s|]{4}|-一个|,除空格外的四个字符和一个管道,然后是一个管道字符
  • 9{2,9}|9{2,9}- 2到9个9字符,|和再次2到9个9字符…
  • (?!d)-后面没有另一个数字(注释如果你不需要检查这里的数字边界,你可以删除这个。你也可以使用(?![^|])代替,如果你需要检查是否有一个|字符或字符串的结束立即在右边)。

g<1>12|21的替换包括对组1 (g<1>)的明确的反向引用和一个附加在它后面的12|21子字符串。

参见Python演示:

import re
texts=['XX=BB|3|3|1|1|PLP|KLWE|9999|9999', 'XX=BB|3|3|1|1|2|PLP|KPOK|99999|99999', '999|999|999|9999|999']
pattern = r'(BB(?:|d){4,6}|[^s|]{3}|[^s|]{4}|)9{2,9}|9{2,9}(?!d)'
repl = r'g<1>12|21'
for text in texts:
print( re.sub(pattern, repl, text) )

输出:

XX=BB|3|3|1|1|PLP|KLWE|12|21
XX=BB|3|3|1|1|2|PLP|KPOK|12|21
999|999|999|9999|999

我将在这里使用re.sub并搜索模式b9{2,9}|9{2,9}b:

inp = ["XX=BB|3|3|1|1|PLP|KLWE|9999|9999" "XX=BB|3|3|1|1|2|PLP|KPOK|99999|99999"]
output = [re.sub(r'b9{2,9}|9{2,9}b', '12|21', i) for i in inp]
print(output)
# ['XX=BB|3|3|1|1|PLP|KLWE|12|21', 'XX=BB|3|3|1|1|2|PLP|KPOK|12|21']

相关内容

  • 没有找到相关文章

最新更新