2017-08-17 178 views
0

與期望的結果我的正則表達式我有一個表達如下:這個表達式可以通過線多次被重複。不完全匹配在python3

period={p1:{R:{M:'-1'}},p2:{R:{D:{start:'-28',end:'-1'}} 

在Python 3,我寫了下面的代碼:

RE_DAY_END = re.compile(r'(D:{start:\'-\d+\'\,end:\')+(?P<dend>\-[0-9]+)') 
match_day= RE_DAY_END.findall(x) 
print(match_day) 

我不能undrestand發生的事情是我收到的時候我期待着得到其他結果的輸出:

I am not interested: [("D:{start:'-28',end:'", '-1')] 

    I need this one:  [("D:{start:'-28',end:'-1')] 

什麼樣的變化我應該做的,以獲得第二個結果?

+1

還原所有組非捕獲。刪除'dend'組。或者使用're.finditer'來訪問'.group(0)'。請參閱https://ideone.com/dHAYUl –

+1

閱讀「pydoc3 re.findall」瞭解發生了什麼。 – Gribouillis

+0

是的,這對我的作品感謝您的解決方案。正如我在這個解決方案中看到的那樣,你也沒有刪除dend組? –

回答

1

簡單的方法來提取單個子(re.search()功能):

s = "period={p1:{R:{M:'-1'}},p2:{R:{D:{start:'-28',end:'-1'}}" 
result = re.search(r'D:\{[^{}]+\}', s).group() 
print(result) 

輸出:

D:{start:'-28',end:'-1'} 
+0

這也很有趣。唯一的一點是,如果你在句子中有幾種模式,只能找到你的第一個模式,而不是其餘的,也許我們可以使用findall而不是搜索。或者用我用@WiktorStribiżew –

+0

的解決方案'根據你的初始輸入和預期的輸出re.search'。當然,對於多個匹配're.findall'或're.finditer'應使用 – RomanPerekhrest

+0

另外還有一點,就是在你表達我不能捕捉精彩的開始和結束,如果我不是這兩個詞的另一個,然後將爲我提取它。順便說一句,你可以開始一點點什麼在做你的表達? –