【问题标题】:Using regex in python to find a string在python中使用正则表达式查找字符串
【发布时间】:2015-10-13 10:36:46
【问题描述】:

我正在尝试查找以{{Infobox 开头并以}} 结尾的字符串s 的子字符串。我尝试使用正则表达式执行此操作,但没有得到任何结果。我认为问题出在我的正则表达式中,但由于我对正则表达式很陌生,我希望有人能帮助解决这个问题。字符串 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))

【问题讨论】:

  • 您期望的输出到底是什么?
  • 我建议你玩一下例如regex101.com/r/rB2bM0/1,并注意您应该使用带有正则表达式的原始 (r'') 字符串以避免反斜杠问题。
  • 从 'persoon..' 到 '...JPG' 的字符串,所以在 'Infobox' 中的所有内容
  • 我尝试过 re.search('{{Infobox.*?}}',s).group() ,这给了我 py 2.6 中的结果。但是在匹配对象时进行分组将是正确的方法

标签: python regex mediawiki


【解决方案1】:

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

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

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

【讨论】:

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

【讨论】:

  • @maxmijn 乐于助人
  • 上述正则表达式将匹配直到它满足 }} 语句是错误的。如果您认为[^}}] 匹配} 以外的2 个字符,那您就错了。它只匹配 一个}。因此,如果路径包含},则此正则表达式将失败。实际上,这里有 2 种方式:1) 缓和的贪婪令牌,2) 惰性点匹配。后者效率更高,我的建议就是基于此。
  • @stribizhev 同意删除我的答案
  • 没有,为什么要删除?您可以提供一个替代方案,使用经过调整的贪婪令牌,但效率会有点低。
  • @VigneshKalai:正确。这就是我从一开始就追求的目标。
【解决方案3】:
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}}

【讨论】:

  • 这不能回答问题。
  • @stribizhev 它展示了一种不同的方法,以这种方式回答了问题。
  • 我的意思是说你的代码输出不是 OP 所期望的。您使用的方法与 Vignesh 的方法基本相同。
猜你喜欢
  • 2016-05-16
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多