除了分隔符转义时,使用正则表达式分隔符拆分字符串

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需要固定宽度模式

Wik*_*żew 6

您可以使用一个模式匹配序列,该模式将匹配任何非逗号的字符,或者前面带有奇数个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)

请参阅Python演示正则表达式演示.

图案细节:

  • (?:(?<!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)

查看另一个在线Python演示.

这里,模式匹配1个或多个逗号(,+),前面有任何0+序列,ZZ前面没有另一个Z(即偶数Z).