我有一个代码(将'Z'视为转义字符,并将','视为分隔符):
import re
a = 'aaa,bbbZ,cccZZ,dddZZZ,eee'
print re.split(r'(?<!Z)[,]+', a)
结果是:
['aaa','bbbZ,cccZZ,dddZZZ,eee']
但我需要处理转义序列的结果(在我的示例中,转义字符为'Z'):
['aaa','bbbZ,cccZZ','dddZZZ,eee']
当我尝试使用可变宽度模式进行负反向断言:
print re.split(r'(?<!(ZZ)*Z)[,]+', a)
它说:
sre_constants.error:look-behind需要固定宽度模式
答案 0 :(得分:6)
您可以将序列与一个模式匹配,该模式将匹配任何非逗号的字符,或任何前面带有奇数Z
s的1+逗号:
import re
a = 'aaa,bbbZ,cccZZ,dddZZZ,eee'
print(re.findall(r'(?:(?<!Z)Z(?:ZZ)*,+|[^,])+', a))
# => ['aaa', 'bbbZ,cccZZ', 'dddZZZ,eee']
模式详情:
(?:(?<!Z)Z(?:ZZ)*,+|[^,])+
- 出现1次或多次:
(?<!Z)Z
- Z
之前没有Z
(?:ZZ)*
- 零个或多个ZZ
,+
- 一个或多个逗号|
- 或[^,]
- 任何不是逗号的字符使用PyPi regex module,您可以将regex.split
方法与(?<=(?<!Z)(?:ZZ)*),+
正则表达式一起使用:
import regex
a = 'aaa,bbbZ,cccZZ,dddZZZ,eee'
print(regex.split(r'(?<=(?<!Z)(?:ZZ)*),+', a))
# ['aaa', 'bbbZ,cccZZ', 'dddZZZ,eee']
请参阅another online Python demo。
此处,模式匹配一个或多个逗号(,+
),这些逗号前面有ZZ
的任何0 +序列,前面没有另一个Z
(即,偶数Z
)。