仅当未以特定模式包装时,才通过分隔符拆分字符串

时间:2013-11-21 18:03:30

标签: python regex

我试图通过分隔符将一个字符串拆分成一个列表(假设为,)但是只有当分隔符字符没有包含在特定模式中时才应该将分隔符视为分隔符,在我的特定情况下{ {1}}。 IOW,当逗号嵌套在<>中时,它将被忽略为分隔符,变成一个不被分隔的常规字符。

所以,如果我有以下字符串:

<>

它应分成

"first token, <second token part 1, second token part 2>, third token"

毋庸置疑,我不能只通过list[0] = "first token" list[1] = "second token part 1, second token part 2" list[2] = "third token" 进行简单的拆分,因为这会将第二个令牌分成两个令牌,second token part 1,因为它们之间有一个逗号它们。

如何使用second token part 2定义模式来执行此操作?

2 个答案:

答案 0 :(得分:10)

更新:由于您提到括号可能是嵌套的,我很遗憾地通知您,Python中的正则表达式解决方案不可能。仅当尖括号始终平衡且从不嵌套或转义时,以下内容才有效:

>>> import re
>>> s = "first token, <second token part 1, second token part 2>, third token"
>>> regex = re.compile(",(?![^<>]*>)")
>>> regex.split(s)
['first token', ' <second token part 1, second token part 2>', ' third token']
>>> [item.strip(" <>") for item in _]
['first token', 'second token part 1, second token part 2', 'third token']

仅当后面的下一个尖括号不是结束尖括号时,正则表达式,(?![^<>]*>)才会在逗号上分割。

嵌套括号排除了这个或任何其他正则表达式解决方案在Python中的工作。您需要一种支持递归正则表达式的语言(如Perl或.NET语言),或者使用解析器。

答案 1 :(得分:6)

适用于您的示例的一种kludgy方式是将&lt;&gt;'翻译为“s,然后将其视为CSV文件:

import csv
import string

s = "first token, <second token part 1, second token part 2>, third token"    
a = s.translate(string.maketrans('<>', '""'))
# first token, "second token part 1, second token part 2", third token
print next(csv.reader([a], skipinitialspace=True))
['first token', 'second token part 1, second token part 2', 'third token']