Python 3.6脚本调用re.findall返回[]而非输入值的问题排查
解决Python3.6中re.findall匹配URL返回空列表的问题
嘿,我来帮你排查这个问题!你遇到的核心状况是:用pyHook捕获键盘/扫码器输入后,re.findall返回空列表,但去掉正则提取后输入内容显示正常——这说明问题肯定出在正则表达式的匹配逻辑或者输入内容的处理环节上,下面分几种常见情况给你分析和解决办法:
1. 正则表达式没跟上实际输入的URL格式
大概率是原脚本里的正则写得太局限,没覆盖你扫码得到的URL情况:
- 比如你扫的是
http://xxx.com,但正则只匹配https://开头的,那肯定匹配不到; - 或者扫码器扫完会自动加个回车(\r)或换行(\n),你的正则没考虑这些尾随的控制字符;
- 还有可能URL里带了特殊字符(比如域名有连字符、下划线),正则里的匹配规则没覆盖到。
修复方案:
换个更通用的URL匹配正则,同时处理掉首尾的空白/控制字符:
import re # 支持http/https/ftp开头,匹配所有非空白字符,忽略大小写 url_pattern = re.compile(r'(https?|ftp)://\S+', re.IGNORECASE) # 假设你捕获到的输入存在buffer变量里,先strip掉首尾的空白、回车换行 matched_urls = url_pattern.findall(buffer.strip())
2. 输入缓冲区的拼接有问题
pyHook是逐个捕获键盘字符的,如果你的脚本在拼接输入内容时没处理好,也会导致正则拿不到完整的URL:
- 比如你在捕获到回车时就触发处理,但此时缓冲区里还没把最后几个字符加进去;
- 或者某些特殊按键(比如Shift键)的处理逻辑有问题,导致字符拼接错误。
检查&修复:
- 先在触发处理前,打印出缓冲区的原始内容(用
repr()能看到不可见字符):
print(f"当前捕获到的内容: {repr(buffer)}")
这样你就能直观看到是不是有多余的字符,或者URL没完整拼接;
- 确认在捕获到
Return(回车)按键时,再把缓冲区的内容拿去匹配正则,这时候扫码器的完整URL应该已经输入完毕了。
3. Python3.6的re模块细节注意点
虽然Python3.6的re模块和后续版本差异不大,但有个小细节要注意:
- 如果你用了
\w来匹配域名,Python3里\w包含Unicode字符,但\S(匹配所有非空白字符)其实更适合匹配URL的各个部分,因为URL里的连字符、点号都不属于\w; - 别用Python3.7+才支持的正则特性(不过这个概率很低,大部分常用语法3.6都支持)。
按照上面的步骤排查,应该就能解决re.findall返回空列表的问题啦!
内容的提问来源于stack exchange,提问作者Xome
相关产品推荐
相关产品推荐

