Return 在 Python 中使用正则表达式时只有一个字符串
Return just ONE string while using Regular Expressions in Python
我正在开发一个简单的程序,它可以从给定的网站中提取链接并将它们放入列表中。之后,"todo"-列表中提取的 URL 将以相同的方式逐步分析。
主程序正在运行,但在下一个版本中,我只想提取主要页面并忽略底部(例如 "www.whosebug.com" 但不是 "www.whosebug.com/questions/ask")
我尝试使用 re.findall
函数,但由于它是一个 list
对象,它破坏了我的可迭代待办事项列表的结构。
是否可以在使用正则表达式时仅 return 一个字符串?
soup = BeautifulSoup(handle, 'html.parser')
newlinks = soup.find_all('a')
for link in newlinks:
todo.append( re.findall('(http://.+)/', link.get('href')) )
如果您只想为每个输入字符串匹配一个,请不要使用 findall
,后者的目的是找到很多匹配项。
相反,使用 re.match(pattern, text)
获取 match
对象。检查 return 值是否不是 None
(表示未找到匹配项),然后对其调用 group(1)
以获取匹配的组。
请注意,您的模式实际上并没有按照您所说的那样进行。如果只想匹配 URL 的初始部分(包括域,但不包括路径),则需要从模式的重复部分中排除斜杠。我会使用 '(http://[^/]+)/'
。使用 +?
而不是 +
的非贪婪重复将是另一种选择。
如果您考虑放弃整个 RegEx 方法来处理您的 URL,您可能想尝试使用 urllib
模块。调用 urllib.parse.urlsplit
会将 URL 分解为以下部分:<scheme>://<netloc>/<path>?<query>#<fragment>
。 (这可能是 Python 3 中的新功能,尽管我不确定。urllib
模块在版本之间进行了相当多的重新排列。)
我正在开发一个简单的程序,它可以从给定的网站中提取链接并将它们放入列表中。之后,"todo"-列表中提取的 URL 将以相同的方式逐步分析。
主程序正在运行,但在下一个版本中,我只想提取主要页面并忽略底部(例如 "www.whosebug.com" 但不是 "www.whosebug.com/questions/ask")
我尝试使用 re.findall
函数,但由于它是一个 list
对象,它破坏了我的可迭代待办事项列表的结构。
是否可以在使用正则表达式时仅 return 一个字符串?
soup = BeautifulSoup(handle, 'html.parser')
newlinks = soup.find_all('a')
for link in newlinks:
todo.append( re.findall('(http://.+)/', link.get('href')) )
如果您只想为每个输入字符串匹配一个,请不要使用 findall
,后者的目的是找到很多匹配项。
相反,使用 re.match(pattern, text)
获取 match
对象。检查 return 值是否不是 None
(表示未找到匹配项),然后对其调用 group(1)
以获取匹配的组。
请注意,您的模式实际上并没有按照您所说的那样进行。如果只想匹配 URL 的初始部分(包括域,但不包括路径),则需要从模式的重复部分中排除斜杠。我会使用 '(http://[^/]+)/'
。使用 +?
而不是 +
的非贪婪重复将是另一种选择。
如果您考虑放弃整个 RegEx 方法来处理您的 URL,您可能想尝试使用 urllib
模块。调用 urllib.parse.urlsplit
会将 URL 分解为以下部分:<scheme>://<netloc>/<path>?<query>#<fragment>
。 (这可能是 Python 3 中的新功能,尽管我不确定。urllib
模块在版本之间进行了相当多的重新排列。)