【问题标题】:Using Regex to find everything after a pattern BUT excluding a variable使用正则表达式查找模式后的所有内容,但不包括变量
【发布时间】:2014-08-22 09:56:28
【问题描述】:

我正在使用以下代码尝试搜索 data-bhc=

之后的文本

但我也想将变量 new_deal 排除在 data-bhc 之后。在这种情况下,new_deal 变量可以是这样的文本:“deal:statler-grill-4”

当我不尝试排除变量时,此正则表达式有效。

例如:

'<figure class=\"deal-card deal-list-tile deal-tile deal-tile-standard\" data-bhc="(.+?)"'

但是当我这样做时,我的语法会强制我的搜索不返回任何内容。什么是愚蠢的错误?

regex = "<figure class=\"deal-card deal-list-tile deal-tile deal-tile-standard\" data-bhc=" + "^(?!" + re.escape(new_deal) + ").*"

pattern = re.compile(regex) 

info = re.search(pattern,htmltext)
print info.groups()

【问题讨论】:

  • 这个问题很有道理。他们需要一个正则表达式来匹配一个模式,其中负前瞻取决于字符串变量 new_deal 的值。

标签: python regex search python-3.x web-scraping


【解决方案1】:

我认为您的问题可能与您使用单引号 ' 和双引号 " 的方式有关。如果您知道 htmltext 中的所有引号都将是双引号,请将您的正则表达式定义为单引号中的字符串。

这可能对你有用:

regex = '<figure class="deal-card deal-list-tile deal-tile deal-tile-standard" data-bhc="(?!'+ new_deal + ').*"'

【讨论】:

  • 我认为这很接近,因为我不再收到错误回退,但我又回来了:() 我尝试了 info.groups(0) 但仍然得到这个空括号
  • @user2218297 试试print info.group(0) 而不是groups(去掉s)
【解决方案2】:

您的正则表达式在您转义new_deal 的前面包含一个^。这将强制正则表达式查找以new_deal 开头的行。

试试:

"data-bhc=(?! *" + re.escape(new_deal) + ").*";

除非 data-bhc 在您的搜索文本中出现很多,否则您可以将上面的内容作为整个正则表达式。否则,只需将其替换为您的 new_deal 转义前瞻。

编辑:我还在负前瞻前添加了一个空间可能性。这将阻止new_deal,即使它前面有一个(或多个)空格。

【讨论】:

  • 是的,它确实出现了很多......我尝试使用上面的方法但仍然没有得到任何匹配:/错误:AttributeError:'NoneType'对象没有属性'groups'@adam yost
  • 也许我没有正确捕获 new_deal 变量......现在我将它硬编码为 new_deal = "deal:statler-grill-4" 所以我应该得到下一场比赛除了statler-grill-4,因为我正在使用 re.search
猜你喜欢
  • 1970-01-01
  • 2016-08-22
  • 2012-10-31
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2011-04-13
相关资源
最近更新 更多