2014-03-29 51 views
1

我是新来的正则表达式,这是困扰着我。我想提取facebook.com/pages/Dr-Morris-Westfried-Dermatologist/176363502456825?id=176363502456825&sk=info。我读过懒惰的量词和lookbehinds,但我仍然无法拼凑出正确的正则表达式。我期望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"> 
+3

在python中搜索HTML分析器。 – hjpotter92

+0

http://stackoverflow.com/a/1732454/2823755 – wwii

回答

2

为什么你的方式不起作用:

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

当正则表达式引擎符合字符串中的第facebook.com\/,既然你以后使用.*?,正则表达式引擎将增加(可能)的比赛结果中的所有字符(包括">或空格),直到找到sk=info (因为.可以匹配除换行符之外的任何字符)。

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

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

2

问题是你有其他facebook.com部分。您可以限制.*不匹配"所以它需要保持一个属性中:

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

好点,固定 – fejese

+0

用文字问号,它不起作用。阅读我的答案下的评论。 – aliteralmind

3

这工作:)

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

Regular expression visualization

Debuggex Demo

由于只有.*它首先发现facebook.com,然后继续,直到sk=info。由于之间还有另一个facebook.com,因此您将它们重叠。

那之间的唯一的事情你想要的是一个>(或<,其他字符之间),所以改变任何  到  什么,但一个>发现facebook.com最接近sk=info,如你所愿。

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

+0

转到debuggex。有用。 '?'可能不是必需的,但它可以工作。它是'[^>] *?'的一部分,它意味着零或多个*而不是'>'* characaters。这不是一个普通的'?',它是所有格修饰符。 – aliteralmind

+0

够公平的;这是一种不情愿,不是占有欲,而是使用它的荣誉。 :) –

+0

“不情愿”。对。不占有。 – aliteralmind

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'] 
+0

这可能是一个更好的方法,但是,这并不能解释为什么模式不起作用。 –

+0

@CasimiretHippolyte问题说:“我想提取...”;这就是上面所说的。此外,[this](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)可能是相关的。 –

+0

@CasimiretHippolyte - 非常感谢正则表达式的解释。我确实使用了BeautifulSoup来完成类似的任务 – Peter