Python:除了引号

时间:2015-08-20 11:43:24

标签: 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.3的re.split命令允许通过正则表达式模式轻松分割文本,但我不确定是否存在正则表达式解决方案,因此我也开放(高效)非正则表达式解决方案。

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

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

  1. 匹配引号外的单个空格是不同的 来自匹配字符分隔符(在我的示例中为 分隔符是3个空格,但问题是任何 多字符分隔符);
  2. Python正则表达式引擎与C ++或其他引擎略有不同 语言正则表达式引擎;
  3. 匹配分隔符是我问题的 B方,直接问题 是关于拆分字符串。

1 个答案:

答案 0 :(得分:2)

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 delimiters ""内不存在re.split(r'delimiter(?=(?:[^"]*"[^"]*")*[^"]*$)',x) ,请使用

git add