在Python中使用正则表达式时只返回一个字符串

时间:2016-03-09 01:21:55

标签: python regex parsing findall

我正在开发一个简单的程序,它从给定的网站中提取链接并将它们放在一个列表中。然后,以相同的方式逐步分析" todo" -list中提取的URL。

主程序正在运行,但在下一个版本中,我只想提取主页并忽略底层(例如" www.stackoverflow.com"但不是" www.stackoverflow.com /问题/问&#34)

我尝试使用re.findall函数但因为它是list对象,它会破坏我的可迭代todo-list的结构。

是否有可能在使用正则表达式时返回一个字符串?

soup = BeautifulSoup(handle, 'html.parser')
newlinks = soup.find_all('a')

for link in newlinks:
    todo.append( re.findall('(http://.+)/', link.get('href')) )

1 个答案:

答案 0 :(得分:0)

如果您只想为每个输入字符串添加一个匹配项,请不要使用findall,其目的是找到许多匹配项。

而是使用re.match(pattern, text)来获取match个对象。检查返回值是否为None(表示未找到匹配项),然后在其上调用group(1)以获取匹配的组。

请注意,您的模式实际上并不是您想要的。如果只想匹配URL的初始部分(包括域,而不是路径),则需要从模式的重复部分中排除斜杠。我使用'(http://[^/]+)/'。使用+?代替+的非贪婪重复是另一种选择。

如果您考虑放弃整个RegEx方法来处理您的网址,您可能需要尝试使用urllib模块。致电urllib.parse.urlsplit会将网址拆分为以下部分:<scheme>://<netloc>/<path>?<query>#<fragment>。 (这可能是Python 3中的一个新功能,虽然我不确定。urllib模块在​​版本之间重新安排了很多。)