我试图通过分隔符将一个字符串拆分成一个列表(让我们说,),但是在我的特定情况下,只有当它没有包裹在某个模式中时,才应将分隔符视为分隔符<>.IOW,当嵌入逗号时<>,它将被忽略为分隔符,变成一个不被分隔的常规字符.
所以,如果我有以下字符串:
"first token, <second token part 1, second token part 2>, third token"
Run Code Online (Sandbox Code Playgroud)
它应该分成
list[0] = "first token"
list[1] = "second token part 1, second token part 2"
list[2] = "third token"
Run Code Online (Sandbox Code Playgroud)
不用说,我不能只是做一个简单的分裂,,因为这将第二令牌拆分成两个标记,second token part 1并且second token part 2,因为他们有一个逗号在它们之间.
我应该如何定义使用它的模式Python RegEx?
Tim*_*ker 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']
Run Code Online (Sandbox Code Playgroud)
,(?![^<>]*>)仅当后面的下一个尖括号不是结束尖括号时,正则表达式才会分割逗号.
嵌套括号排除了这个或任何其他正则表达式解决方案在Python中工作.您需要一种支持递归正则表达式的语言(如Perl或.NET语言),或者使用解析器.
适用于您的示例的一种kludgy方法是将<>转换为"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']
Run Code Online (Sandbox Code Playgroud)