使用Tika解析PDF内IP地址返回空值,请求排查问题
问题排查与解决
核心问题分析
你的代码执行无报错但匹配结果为空,问题主要集中在正则表达式的锚点限制和文本提取有效性验证两个环节:
1. 正则表达式的锚点错误
你使用的正则末尾带有$(行尾锚点),这会强制要求IP地址必须是一行的最后内容,但PDF提取的文本中,IP通常不满足这个条件:
- 可能和其他文本同属一行(比如"设备IP:192.168.1.1")
- 行尾可能存在空格、制表符或其他不可见字符
- PDF文本的换行符格式非标准
\n,导致锚点匹配失效
另外你尝试的第二个正则写法regex = ^'(?:[0-9]{1,3}\.){3}[0-9]{1,3}$'存在语法错误,引号位置错误,正确写法应为regex = '^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$',但即使修正,^(行首锚点)+$的组合也只会匹配整行仅为IP地址的极端场景,实用性极低。
2. 验证Tika的文本提取结果
先确认Tika是否正确读取到PDF内容,在代码中添加打印语句查看text变量:
print(text)
如果输出为空或未包含预期IP,说明Tika提取过程存在问题,需排查:
- 确认
static_hosts.pdf的路径是否正确(脚本需能直接访问该文件) - 检查PDF是否加密、损坏,或Tika不支持该PDF版本
修正后的代码
去掉行尾锚点$,同时使用原始字符串r''避免转义问题,额外添加文本提取验证步骤:
import tika from tika import parser import re if __name__ == '__main__': tika.initVM() parsed_pdf = parser.from_file("static_hosts.pdf") text = parsed_pdf["content"] # 先打印提取的文本,确认是否包含目标IP print("提取的PDF文本内容:") print(text) # 修正正则:移除行尾锚点,使用原始字符串 regex = r'(?:[0-9]{1,3}\.){3}[0-9]{1,3}' match = re.findall(regex, text) print("\n匹配到的IP地址:") print(match)
额外优化:匹配合法IP
如果需要严格过滤无效IP(如256.0.0.1),可使用更精准的正则:
regex = r'(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
内容的提问来源于stack exchange,提问作者Huy Than
相关产品推荐
相关产品推荐

