【问题标题】:Why is non-greedy Python Regex not non-greedy enough?为什么非贪婪的 Python 正则表达式不够非贪婪?
【发布时间】:2016-07-01 14:33:28
【问题描述】:

我在一组字符串 URL 上实现了非贪婪正则表达式,我试图清理它们,以便它们在 .com(.co.uk 等)之后结束。其中一些在所需的截止点后继续使用'"<,因此我使用了x = re.findall('([A-Za-z0-9]+@\S+.co\S*?)[\'"<]', finalSoup2)

问题是某些 URL 是 misc@misc.misc'misc''misc'(或与 类似),因此在实施非贪婪正则表达式后,我仍然留下 enquiries@smart-traffic.com.au">enquiries@smart-traffic.com.au,例如。

我已经尝试了两个 ?? 一起,但显然不起作用,那么在这种情况下,他们获得干净 URL 的正确方法是什么?

【问题讨论】:

  • 或者也许只是让 \S+ 不贪婪:[A-Za-z0-9]+@\S+?.co\S*?)[\'"
  • 我不清楚这个问题。能否请您提供一些详细信息。例子就可以了。
  • 附带说明,使用正则表达式解析 HTML 不是最好的主意,尤其是因为您已经在使用 BeatifulSoup。例如,如果您需要获取所有具有hrefs 的as 并提取那些hrefs,BS 允许您在几行中完全做到这一点,而无需任何正则表达式。
  • 我现在正在学习不同技术的正确用法。你的评论其实很有帮助

标签: python regex non-greedy


【解决方案1】:

您的正则表达式的问题是您目前只在寻找 Non-spaces(period)co 而不是寻找 Non-spaces(period)Non-spaces。

因此,在这种情况下,您可以根据上述信息使用以下正则表达式。

>>> finalSoup2 = """
... misc@misc.misc'misc''misc
... enquiries@smart-traffic.com.au">enquiries@smart-traffic.com.au
... google.com
... google.co.uk"'<>Stuff
... """
>>>x = re.findall('([A-Za-z0-9]+@[^\'"<>]+)[\'"<]', finalSoup2)
>>>x
['misc@misc.misc',
 'enquiries@smart-traffic.com.au',
 'enquiries@smart-traffic.com.au\ngoogle.com\ngoogle.co.uk']

然后您可以使用它来获取您想要的网址,但您必须确保在 r'\n' 上拆分它们,因为它们可能在文本中包含换行符,如上所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多