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" 或其他类似问题的重复,因为:
- 匹配一个单space外引号是不同的
来自匹配 multi 字符定界符(在我的示例中
分隔符是3 spaces,但是问题是关于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']
对于通用版本,如果您想 split
on delimiters
不存在于 ""
中,请使用
re.split(r'delimiter(?=(?:[^"]*"[^"]*")*[^"]*$)',x)
在我的例子中,分隔符字符串是 ' '
(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" 或其他类似问题的重复,因为:
- 匹配一个单space外引号是不同的 来自匹配 multi 字符定界符(在我的示例中 分隔符是3 spaces,但是问题是关于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']
对于通用版本,如果您想 split
on delimiters
不存在于 ""
中,请使用
re.split(r'delimiter(?=(?:[^"]*"[^"]*")*[^"]*$)',x)