在python中使用正则表达式来查找字符串

在python中使用正则表达式来查找字符串

问题描述:

我试图找到一个字符串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

您可以使用懒点匹配,因为您的分隔符不是单符号分隔符,并且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://*.com/questions/1732348/regex-match-open-tags-except-xhtml-self-包含标签/ 1732454#1732454)等)。改为使用[mwparserfromhell](http://mwparserfromhell.readthedocs.org/en/latest/usage.html)等。 – Tgr

代码:

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)懒点匹配。后者更有效率,我的建议是基于此。 –

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的方法基本相同。 –