2015-10-13 105 views
1

我試圖找到一個字符串s的子字符串,從{{Infobox開始,並以}}結尾。我試着用正則表達式來做這件事,但它沒有得到任何結果。我認爲這個錯誤是在我的正則表達式中,但是因爲我已經退出了正則表達式,所以我希望有人能夠幫助解決這個問題。字符串s,例如:在python中使用正則表達式來查找字符串

s = '{{blabla}}{{Infobox persoon Tweede Wereldoorlog| naam=Albert Speer| afbeelding=Albert Speer Neurenberg.JPG}}{{blabla}}' 

result = re.search('(.*)\{\{Infobox (.*)\}\}(.*)', s) 
if result: 
    print(result.group(2)) 
+0

確切地說,你期待什麼作爲輸出? –

+0

我建議你玩一個例如https://regex101.com/r/rB2bM0/1,並注意你應該使用正則表達式的raw('r''')字符串來避免反斜槓的問題。 – jonrsharpe

+0

從'persoon ..'到'... JPG'的字符串,所以'Infobox' – maxmijn

回答

4

您可以使用懶點匹配,因爲您的分隔符不是單符號分隔符,並且cap TURE你需要到組1什麼:

import re 
p = re.compile(r'\{\{Infobox\s*(.*?)}}') 
test_str = "{{blabla}}{{Infobox persoon Tweede Wereldoorlog| naam=Albert Speer| afbeelding=Albert Speer Neurenberg.JPG}}{{blabla}}" 
match = p.search(test_str) 
if match: 
    print(match.group(1)) 

IDEONE demo

如果使用否定的字符類,任何{}的信息框裏面將防止整個字符串匹配。另外,由於您在需要的子字符串前後似乎不需要子字符串,因此您根本不需要匹配(或捕獲)它們(因此,我將它們刪除了它們)。

+0

請注意,如果你有你需要使用're.S' /'re.DOTALL'修飾符:['p = re.compile(r'\ {\ Infobox \ s *(。*?)}}' ,re.S)'](https://ideone.com/cpm54O)。 –

+0

實際上,由於信息框可以(並且經常)包含其他模板,所以這種方法效果不佳。用正則表達式解析樹結構通常是一個壞主意([{{center}}'不能保存](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-包含標籤/ 1732454#1732454)等)。改爲使用[mwparserfromhell](http://mwparserfromhell.readthedocs.org/en/latest/usage.html)等。 – Tgr

2

代碼:

import re 
s = '{{blabla}}{{Infobox persoon Tweede Wereldoorlog| naam=Albert Speer| afbeelding=Albert Speer Neurenberg.JPG}}{{blabla}}' 

result = re.search(r'(.*){{Infobox ([^}]*?)}}(.*)', s) 
if result: 
    print(result.group(2)) 

輸出:

persoon Tweede Wereldoorlog| naam=Albert Speer| afbeelding=Albert Speer Neurenberg.JPG 

注意:上述正則表達式匹配,直到它符合第一}之後{{Infobox

重要提示:

這將僅適用於情況下,像給定樣本輸入工作

它不會如果輸入有i.e){{blabla}}{{Infobox persoon Tweede Wereldoorlog| naam=Albert Speer| }afbeelding=Albert Speer Neurenberg.JPG}}{{blabla}}之間的}案件一樣,stribizhev的回答是工作最佳解決方案

+0

正是我想要的,謝謝! – maxmijn

+0

@maxmijn樂意幫忙 – The6thSense

+0

**上面的正則表達式會匹配,直到遇到}} **語句是錯誤的。如果您認爲'[^}}]'匹配除''以外的2個字符,那麼您就錯了。它只匹配**一個**非'}'。所以,如果路徑包含'}',這個正則表達式將失敗。實際上,這裏有兩種方法:1)脾氣暴躁的令牌,2)懶點匹配。後者更有效率,我的建議是基於此。 –

0
s = '{{blabla}}{{Infobox persoon Tweede Wereldoorlog| naam=Albert Speer| afbeelding=Albert Speer Neurenberg.JPG}}{{blabla}}' 

# start with Infobox and two chars before, grab everything but '}', followed by two chars 
mo = re.search(r'(..Infobox[^}]*..)',s) 


print(mo.group(1)) 


# {{Infobox persoon Tweede Wereldoorlog| naam=Albert Speer| afbeelding=Albert Speer Neurenberg.JPG}} 
+0

這不回答這個問題。 –

+0

@stribizhev它顯示了一種不同的方法,以這種方式回答了這個問題。 – LetzerWille

+0

我的意思是說你的代碼輸出不是OP所期望的。你使用的方法與Vignesh的方法基本相同。 –

相關問題