我是正则表达式的新手,这让我很难过。
在以下示例中,我想提取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&sk=info" aria-label="About Dr. Morris Westfried - Dermatologist">
答案 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
仅.*
时,它会找到第一个 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解析器提供安全性,简单性,则它在性能方面具有成本,因为您需要为单个任务加载文档的整个树。