正则表达式量词

时间:2014-03-29 22:54:57

标签: python regex reluctant-quantifiers

我是正则表达式的新手,这让我很难过。

在以下示例中,我想提取facebook.com/pages/Dr-Morris-Westfried-Dermatologist/176363502456825?id=176363502456825&sk=info。我已经阅读了懒惰量词和外观,但我仍然无法拼凑出正确的正则表达式。我希望facebook.com\/.*?sk=info可以工作,但它会捕获太多。你们能帮忙吗?

<i class="mrs fbProfileBylineIcon img sp_2p7iu7 sx_96df30"></i></span><span class="fbProfileBylineLabel"><span itemprop="address" itemscope="itemscope" itemtype="http://schema.org/PostalAddress"><a href="https://www.facebook.com/pages/Dr-Morris-Westfried-Dermatologist/176363502456825?sk=page_map" target="_self">7508 15th Avenue, Brooklyn, New York 11228</a></span></span></span><span class="fbProfileBylineFragment"><span class="fbProfileBylineIconContainer"><i class="mrs fbProfileBylineIcon img sp_2p7iu7 sx_9f18df"></i></span><span class="fbProfileBylineLabel"><span itemprop="telephone">(718) 837-9004</span></span></span></div></div></div><a class="title" href="https://www.facebook.com/pages/Dr-Morris-Westfried-Dermatologist/176363502456825?id=176363502456825&amp;sk=info" aria-label="About Dr. Morris Westfried - Dermatologist">

4 个答案:

答案 0 :(得分:4)

尽管我喜欢正则表达式,但这是一个html解析任务:

>>> from bs4 import BeautifulSoup
>>> html = .... # that whole text in the question
>>> soup = BeautifulSoup(html)
>>> pred = lambda tag: tag.attrs['href'].endswith('sk=info')
>>> [tag.attrs['href'] for tag in filter(pred, soup.find_all('a'))]
['https://www.facebook.com/pages/Dr-Morris-Westfried-Dermatologist/176363502456825?id=176363502456825&sk=info']

答案 1 :(得分:3)

这有效:)

facebook\.com\/[^>]*?sk=info

Regular expression visualization

Debuggex Demo

.*时,它会找到第一个 facebook.com,然后一直持续到sk=info。由于之间存在另一个facebook.com,因此重叠它们。

之间的独特之处在于>(或<,以及其他字符),因此更改任何内容除<{1}} 以外的任何内容,您可以根据需要找到> 最接近 facebook.com

是的,使用HTML的正则表达式只能用于基本任务。否则,请使用解析器。

答案 2 :(得分:2)

问题是你有另一个facebook.com部分。您可以将.*限制为不匹配",因此它需要保留在一个属性中:

facebook\.com\/[^"]*;sk=info

答案 3 :(得分:2)

为什么您的模式不起作用

您的模式不起作用,因为正则表达式引擎会在字符串中尝试从左到右模式

当正则表达式引擎遇到字符串中的第一个facebook.com\/,并且之后使用.*?时,正则表达式引擎将添加(可能的)匹配结果所有字符(包括{{1 }}或"或空格),直到找到>(因为sk=info可以匹配除换行符之外的任何字符)。

这就是为什么fejese建议用.替换点或aliteralmind建议用[^"]替换它以使模式在字符串中的这个位置失败(第一个)。

如果你想处理html,使用html解析器是最简单的方法。但是,对于ponctual匹配或搜索/替换,请注意,如果html解析器提供安全性,简单性,则它在性能方面具有成本,因为您需要为单个任务加载文档的整个树。