在 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))
如果您使用否定字符 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}}
我正在尝试查找字符串 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))
如果您使用否定字符 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}}