正则表达式如下
( https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]
复现代码:
import re
url_pattern = re.compile(r'( https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]')
print("search", url_pattern.search("http://1.com 和 http://2.com"))
print("findall", url_pattern.findall("http://1.com 和 http://2.com"))
为什么二者表现不同呢?如果我想用 url_pattern.findall()
得到 ["http://1.com","http://2.com"]
这样的结果,该如何修改代码?
感谢 @hicdn #2 的回答,将表达式修改为 (?:https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]
即可正常匹配 URL
1
J0rmo 2023-10-19 22:06:29 +08:00
import re
url_pattern = re.compile(r'( https?|ftp|file)(://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|])') print([ ''.join(v) for v in url_pattern.findall("http://1.com 和 http://2.com") ]) |
2
hicdn 2023-10-19 22:38:51 +08:00 1
你用了正则的分组,() 内的内容就是分组,findall 在有分组时,只返回分组匹配内容。
不分组就能得到你期望的结果 ( https?|ftp|file) -> (?: https?|ftp|file) |
3
guog 2023-10-19 22:59:19 +08:00
import re
# 如果没啥特殊匹配要求的话可以简化正则 url_pattern = r'( https?|ftp|file)://\S+' text = "http://1.com 和 http://2.com" matches = re.finditer(url_pattern, text) results = [] if matches: results = [match.group() for match in matches] print(results) else: print("No URLs found.") |