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

Using regex in python to find a string

我正在尝试查找字符串 s 的子字符串,以 {{Infobox 开头并以 }} 结尾。我尝试使用正则表达式执行此操作,但没有得到任何结果。我认为错误出在我的正则表达式中,但由于我对正则表达式很陌生,所以我希望有人可以帮助解决这个问题。字符串 s 例如:

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))

代码:

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 的答案是最好的解决方案

您可以使用 惰性点匹配,因为您的定界符不是单符号定界符,并将您需要的内容捕获到第 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

如果您使用否定字符 class,信息框内的任何 {} 将阻止匹配整个子字符串。

此外,由于您似乎不需要您需要的子串前后的子串,因此您根本不需要匹配(或捕获)它们(因此,我删除了它们)。

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}}