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

标签 python regex string split delimiter

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

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

解决方案应返回以下字符串:

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

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

我已经看到一些使用包含正则表达式模式的前瞻/后视来解决逆向问题的方法,但它们不起作用,因为 Python 前瞻/后视(与其他语言引擎不同)需要固定宽度的模式。

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

  1. 匹配引号外的单个空格是不同的 从匹配一个字符定界符(在我的例子中 分隔符是 3 个空格,但问题是关于 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']

对于通用版本,如果您想在 "" 中不存在的 delimiters拆分,请使用

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

关于Python:除非在引号内,否则用多字符定界符拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32117330/

相关文章:

python - 在 Python 脚本中设置 mayaVI 管线属性

python - 如何用 Python3 读写 INI 文件?

Python 正则表达式与 devanAgarI

c++ - “variantToString”未在此范围内声明

php - 如何将可变数量的参数传递给 sprintf() 函数?

python - 在多处理 pool.starmap 中传递字符串列表时出错

python - 根据组的天间隔为列分配值的优雅方法

python - 获取缩写和定义的程序 - 获取所有小写缩写时遇到问题

用于验证的正则表达式格式

c - 使用 sscanf 读取空间