我有一个字符串列表。
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
- aBB
string(?:|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']