簡體   English   中英

僅當未以特定模式包裝時,才通過分隔符拆分字符串

[英]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 1second 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM