簡體   English   中英

正則表達式拆分

[英]Regular Expression Splitting

我是regex的新手,因此無法拆分以下字符串:

test_str = "./name[contains(substring(.,1,3),'some')],is-in,up,down"

該字符串以逗號分隔,但如果該組包含[],則不應以逗號分隔。

因此結果應如下所示:

["./name[contains(substring(.,1,3),'some')]", "is-in", "up", "down"]

我正在嘗試這個正則表達式:

r"./*[a-z]+((\[.*?\])?)*,?/*"

...但是“-”存在一些問題

這不是使用正則表達式的解決方案,但仍然是這樣:

# Create a function to get the number of "interesting commas" in the string:
f = lambda x: x.split(']')[1].count(',') if '[' in x and ']' in x else x.count(',')

# Reverse the string and split on the "interesting commas" and then reverse it back to normal:
[x[::-1] for x in test_str[::-1].split(",",f(test_str))][::-1]

應該返回:

# ["./name[contains(substring(.,1,3),'some')]", 'is-in', 'up', 'down']

我希望這有幫助。

我覺得您可以使用堆棧而不是使用re來跟蹤打開和關閉方括號,並在必要時將它們連接起來。 假設您的閉括號總是比開括號多或相等。 以下代碼是不言自明的,希望對您有所幫助。

test_str = "./name[contains(substring(.,1,3),'some')],is-in,up,down"

result = test_str.split(',')

output = []

for token in result:
    if '[' in token:
        output.append(token)
    elif ']' in token and output:
        output[-1] += token
    else:
        output.append(token)
print output

RegExps的功能不足以完成您的任務,因此我的解決方案必須使用的不僅僅是RegExps。

首先,我建議隔離[...]部分:

 w = re.split(r'(\[.*?\])', test_str)
 ts = [[t] if t.startswith('[') else t.split(',') for t in w ]

然后進入ts[['./name'], ["[contains(substring(.,1,3),'some')]"], ['', 'is-in', 'up', 'down']]之后,必須將列表合並:

reduce(lambda x, y: x+[y[0]] if y[0] and y[0].startswith('[') else x+y, ws)

產生(在這種情況下):

['./name', "[contains(substring(.,1,3),'some')]", '', 'is-in', 'up', 'down']

剩下的是:加入一些列表/刪除空字符串。 此解決方案應適用於大多數情況...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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