Python:用多字符定界符分割字符串,除非在引号内

Python: split string by a multi-character delimiter unless inside quotes

在我的例子中,分隔符字符串是 ' '(3 个连续的 spaces,但答案应该适用于任何多字符分隔符),要搜索的边缘情况文本可以是这个:

'Coord="GLOB"AL   Axis=X   Type="Y   ZR"   Color="Gray Dark"   Alt="Q   Z"qz   Loc=End'

解决方案应该return以下字符串:

Coord="GLOB"AL
Axis=X
Type="Y   ZR"
Color="Gray Dark"
Alt="Q   Z"qz
Loc=End

我一直在寻找正则表达式解决方案,还评估了反问题(匹配多字符定界符,除非在引号内),因为 re.split 命令 Python 3.4.3 允许通过正则表达式模式轻松拆分文本,但我不确定是否存在正则表达式解决方案,因此我也对(有效的)非正则表达式解决方案持开放态度。

我已经看到一些使用 lookahead/lookbehind 包含正则表达式模式的逆向问题的解决方案,但它们没有用,因为 Python lookahead/lookbehind(与其他语言引擎不同)需要固定-宽度模式。

这个问题不是 Regex matching spaces, but not in "strings" 或其他类似问题的重复,因为:

  1. 匹配一个space外引号是不同的 来自匹配 multi 字符定界符(在我的示例中 分隔符是3 spaces,但是问题是关于any 多字符分隔符);
  2. Python 正则表达式引擎与 C++ 或其他引擎略有不同 语言正则表达式引擎;
  3. 匹配定界符是我问题的B面,直接问题 关于拆分字符串。
x='Coord="GLOB"AL   Axis=X   Type="Y   ZR"   Color="Gray Dark"   Alt="Q   Z"qz   Loc=End'
print re.split(r'\s+(?=(?:[^"]*"[^"]*")*[^"]*$)',x)

您需要使用 lookahead 来查看 space 是否不在 ""

之间

输出['Coord="GLOB"AL', 'Axis=X', 'Type="Y ZR"', 'Color="Gray Dark"', 'Alt="Q Z"qz', 'Loc=End']

对于通用版本,如果您想 split on delimiters 不存在于 "" 中,请使用

re.split(r'delimiter(?=(?:[^"]*"[^"]*")*[^"]*$)',x)