求助: Python 正则模块 search findall 表现不同

2023-10-19 21:13:36 +08:00
 Leon6868

正则表达式如下

( 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"] 这样的结果,该如何修改代码?

1190 次点击
所在节点    Python
4 条回复
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.comhttp://2.com") ])
hicdn
2023-10-19 22:38:51 +08:00
你用了正则的分组,() 内的内容就是分组,findall 在有分组时,只返回分组匹配内容。
不分组就能得到你期望的结果
( https?|ftp|file)
->
(?: https?|ftp|file)
guog
2023-10-19 22:59:19 +08:00
import re

# 如果没啥特殊匹配要求的话可以简化正则

url_pattern = r'( https?|ftp|file)://\S+'

text = "http://1.comhttp://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.")
Leon6868
2023-10-20 00:29:14 +08:00
@hicdn #2 感谢!我在 js 下使用这个正则就没有问题,请问是 findall 的特性吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/983600

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX