Sym*_*mon 2 python regex string split
我有一个代码(将'Z'视为转义字符,并将','视为分隔符):
import re
a = 'aaa,bbbZ,cccZZ,dddZZZ,eee'
print re.split(r'(?<!Z)[,]+', a)
Run Code Online (Sandbox Code Playgroud)
结果是:
['aaa','bbbZ,cccZZ,dddZZZ,eee']
但我需要结果处理转义序列(在我的示例中,转义字符为'Z'):
['aaa','bbbZ,cccZZ','dddZZZ,eee']
当我尝试使用可变宽度模式进行负向后观断言时:
print re.split(r'(?<!(ZZ)*Z)[,]+', a)
Run Code Online (Sandbox Code Playgroud)
它说:
sre_constants.error:look-behind需要固定宽度模式
您可以使用一个模式匹配序列,该模式将匹配任何非逗号的字符,或者前面带有奇数个Zs的任何1+逗号:
import re
a = 'aaa,bbbZ,cccZZ,dddZZZ,eee'
print(re.findall(r'(?:(?<!Z)Z(?:ZZ)*,+|[^,])+', a))
# => ['aaa', 'bbbZ,cccZZ', 'dddZZZ,eee']
Run Code Online (Sandbox Code Playgroud)
图案细节:
(?:(?<!Z)Z(?:ZZ)*,+|[^,])+ - 出现1次或多次:
(?<!Z)Z- 一个Z没有立即开始Z(?:ZZ)* - 零个或多个序列 ZZ,+ - 一个或多个逗号| - 要么[^,] - 任何不是逗号的字符使用PyPi正则表达式模块,您可以使用regex.split带(?<=(?<!Z)(?:ZZ)*),+正则表达式的方法:
import regex
a = 'aaa,bbbZ,cccZZ,dddZZZ,eee'
print(regex.split(r'(?<=(?<!Z)(?:ZZ)*),+', a))
# ['aaa', 'bbbZ,cccZZ', 'dddZZZ,eee']
Run Code Online (Sandbox Code Playgroud)
这里,模式匹配1个或多个逗号(,+),前面有任何0+序列,ZZ前面没有另一个Z(即偶数Z).
| 归档时间: |
|
| 查看次数: |
382 次 |
| 最近记录: |