Python如何循环读取无限多行输入并单独提取其中的URL地址
多行输入提取URL实现方案
原有方案存在两个核心问题,无法满足需求:
- 以空行作为输入终止判断条件,既不符合“无限多行输入”的要求,也无法处理内容中本身包含空行的场景
- 仅完成了输入内容的拼接存储,没有实现URL提取的核心逻辑
具体实现代码
直接用Python标准库即可实现,不需要安装第三方依赖:
import re # 预编译URL匹配规则,覆盖绝大多数HTTP/HTTPS协议的URL场景 url_match_rule = re.compile(r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+[/\w\-\.?=&%#]*') url_result = [] while True: try: line_content = input() # 逐行提取匹配到的URL,追加到结果列表 url_result.extend(url_match_rule.findall(line_content)) except EOFError: # 捕获输入终止信号:用户按Ctrl+D(macOS/Linux)/Ctrl+Z后回车(Windows)时结束读取 break # 如需保留重复URL,可注释掉下方去重代码 url_result = list(dict.fromkeys(url_result)) # 输出结果 print("提取完成,共获取到以下URL:") for index, single_url in enumerate(url_result, start=1): print(f"{index}. {single_url}")
方案说明
- 输入读取逻辑不再以空行作为中断条件,支持任意行数的输入,中间夹杂空行也不会影响读取流程
- 采用逐行匹配的方式提取URL,不需要把所有输入内容全量加载到内存拼接,大文本输入下内存占用更低、运行速度更快
- 默认对结果做了顺序去重,不会打乱URL首次出现的顺序;如果需要保留重复出现的URL,注释掉对应去重代码即可
- 如果需要提取FTP、SSH等其他协议开头的URL,只需要修改正则规则的协议匹配部分即可
内容的提问来源于stack exchange,提问作者pavel
相关产品推荐
相关产品推荐

