在我的例子中,分隔符字符串是 ' '
(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"的重复或类似的其他问题,因为:
- 匹配引号外的单个空格是不同的 从匹配一个多字符定界符(在我的例子中 分隔符是 3 个空格,但问题是关于 any 多字符分隔符);
- Python 正则表达式引擎与 C++ 或其他引擎略有不同 语言正则表达式引擎;
- 匹配分隔符是我问题的 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/