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

时间:2017-07-17 12:45:29

标签: python regex string split

我有一个代码(将'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需要固定宽度模式

1 个答案:

答案 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']

请参阅Python demoregex demo

模式详情

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