2017-04-19 236 views
1

我想正則表達式寫到具有以下格式正則表達式匹配括號中的字符串

12740(34,12)的字符串[ABC(A1B2C3)(a2b3c4)......] myId123

目前,我有這樣的事情

\((?P<expression>\S+)\) 

但有了這個,我可以只收集方括號中的字符串。

是否有無論如何我可以捕捉方括號前的整數,還有方括號內的字符串。

小括號內的字符串數量將不會相同。我也可以有一個字符串,它看起來像這樣

10(3,2),[ABC(A1B2C3)] myId1

我知道我可以寫使用蠻力上述表達一個簡單的正則表達式。但任何人都可以請幫我寫一個方括號內的字符串數量不斷變化。

((?P<front>^\d+)|\((?P<expression>\S+)\)|(?P<id>[a-zA-Z0-9]+)$) 

Regex101:提前

+1

你不能使用're'的單個正則表達式來捕獲任意數量的組。您在比賽中只有與該模式中定義的數量相同的組。 –

+0

@WiktorStribiżewohk,刪除.. !! –

+0

@WiktorStribiżew這是一個愚蠢的問題(無論OP是否意識到)每個「用正則表達式解析HTML/XML」的問題。我們沒有一個規範的「正則表達式/ CFG」問題來關閉它們嗎?也許我們應該。 –

回答

2

感謝您可以通過使用^$,這意味着開始,分別結束捕捉信息

https://regex101.com/r/PoA5k4/1

要使結果更有用,我會把它變成字典:

import re 

myStr = "12740(34,12) [abc (a1b2c3) (a2b3c4)......] myId123" 
di = {} 
for find in re.findall("((?P<front>^\d+)|\((?P<expression>\S+)\)|(?P<id>[a-zA-Z0-9]+)$)",myStr): 
    if find[1] != "": 
     di["starter"] = find[1] 
    elif find[3] != "": 
     di["id"] = find[3] 
    else: 
     di.setdefault("expression",[]).append(find[2]) 
print(di) 
+0

中工作。 。非常感謝您的回答。 – sjaymj62