【问题标题】:Split string with regex separator except when separator is escaped使用正则表达式分隔符拆分字符串,除非分隔符被转义
【发布时间】:2017-07-17 12:45:29
【问题描述】:

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

【问题讨论】:

  • 请先说明你想做什么。不是如何你这样做......
  • 我的目标在标题中
  • 但是根本没有转义...
  • @WillemVanOnsem "escape char is 'Z'" 如果有帮助,可以将 Z 视为反斜杠。

标签: python regex string split


【解决方案1】:

您可以将序列与一个模式匹配,该模式将匹配任何不是逗号的字符,或者任何 1+ 逗号前面有奇数个 Zs:

import re
a = 'aaa,bbbZ,cccZZ,dddZZZ,eee'
print(re.findall(r'(?:(?<!Z)Z(?:ZZ)*,+|[^,])+', a))
# => ['aaa', 'bbbZ,cccZZ', 'dddZZZ,eee']

查看Python demoregex demo

模式详情

  • (?:(?&lt;!Z)Z(?:ZZ)*,+|[^,])+ - 1 次或多次出现:
    • (?&lt;!Z)Z - Z 前面没有紧跟 Z
    • (?:ZZ)* - 零个或多个ZZ 序列
    • ,+ - 1 个或多个逗号
    • | - 或
    • [^,] - 任何不是逗号的字符

使用PyPi regex module,您可以使用regex.split 方法和(?&lt;=(?&lt;!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

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

【讨论】:

  • @Symon:仅适用于 PyPi 正则表达式模块。
  • 你能举个例子吗?
  • 我建议:(?:Z.)*(*SKIP)\K,+ 代表 regex.split(?=[^,])[^,Z]*(?:Z.[^,Z]*)*Z? 代表 re.findall
猜你喜欢
  • 2011-05-23
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 2011-02-24
  • 1970-01-01
  • 2014-05-31
相关资源
最近更新 更多