【问题标题】:Regex not working to get string between 2 strings. Python 27 [duplicate]正则表达式无法在 2 个字符串之间获取字符串。 Python 27 [重复]
【发布时间】:2017-03-01 21:50:20
【问题描述】:

从此网址查看-来源:https://www.amazon.com/dp/073532753X?smid=A3P5ROKL5A1OLE 我想得到var iframeContent =obj.onloadCallback = onloadCallback;之间的字符串

我有这个正则表达式iframeContent(.*?)obj.onloadCallback = onloadCallback;

但它不起作用。我不擅长正则表达式,所以请原谅我缺乏知识。

我什至尝试过iframeContent(.*?)obj.onloadCallback,但它不起作用。

【问题讨论】:

  • 它不起作用是什么意思?请发布stackoverflow.com/help/mcve 示例,并尝试从原始数据中摘录您认为必须匹配的字符串。亚马逊页面挤满了可能的匹配点,因此很难帮助您从这个问题中获得想要的结果。

标签: python regex


【解决方案1】:

看起来你只是想要那个巨大的编码字符串。我相信你的失败有两个原因。您没有在DOTALL 模式下运行,这意味着您的. 不会跨多行匹配,并且您的正则表达式由于catastrophic backtracking 而失败,当您有一个非常 长可变长度匹配,匹配与它后面的字符相同的字符。

这应该得到你想要的

m = re.search(r'var iframeContent = \"([^"]+)\"', html_source)
print m.group(1)

正则表达式只是在两个双引号之间寻找除双引号 [^"] 之外的任何字符。因为变长匹配和紧随其后的匹配不匹配任何相同的字符,所以不会遇到灾难性的回溯问题。

【讨论】:

  • 那行得通。非常感谢对正则表达式的一点解释
【解决方案2】:

你也可以试试这个正则表达式

(?<=iframeContent =)(.*)(?=obj.onloadCallback = onloadCallback)

您可以在this site 进行测试。

你使用DOTALL模式很重要吗,这意味着你会有单行

【讨论】:

    【解决方案3】:

    我怀疑输入字符串跨越多行。尝试在搜索行中添加re.M(即re.findall('someString', text_Holder, re.M))。

    【讨论】:

      猜你喜欢
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2018-07-30
      • 2018-03-22
      相关资源
      最近更新 更多