[英]Split string by delimiter only if not wrapped in certain pattern
我想通過一個分隔符(假設分割字符串轉換成列表,
),但分隔符應考慮,只有當它不裹一定的模式,在我的具體情況的分隔符<>
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
,因為它們之間有一個逗號。
我應該如何使用Python RegEx
定義模式?
更新:既然你提到括號可能是嵌套的,我很遺憾地告訴你,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語言),或者使用解析器。
適用於您的示例的一種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']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.