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

amp*_*ent 6 python regex

我试图通过分隔符将一个字符串拆分成一个列表(让我们说,),但是在我的特定情况下,只有当它没有包裹在某个模式中时,才应将分隔符视为分隔符<>.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语言),或者使用解析器.


Jon*_*nts 6

适用于您的示例的一种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)