python re.findall不匹配重复项

0 投票
1 回答
881 浏览
提问于 2025-04-19 14:50

假设输入的数据是这样的。实际上它更长,但为了清晰起见,我就留这样。

有效期从:2014年3月5日星期三 15:40:45 GMT+00:00 到:2034年1月5日星期四 08:28:29 GMT+00:00
有效期从:2014年1月10日星期五 08:28:29 GMT+00:00 到:2034年1月5日星期四 08:28:29 GMT+00:00

这是我的代码:

 certDataArray = []
            patterns = ['Alias name:\s(.*)\n', 'Owner:\s(.*)\n', 'Issuer:\s(.*)\n', 'Serial number:\s(.*)\n', 'Valid from:\s(.*) until', 'until:\s(.*)\n']
            for pattern in patterns:
                result = re.compile(pattern)
                result = result.findall(cmd)
                certDataArray.append(result)
            certDataArray = zip(certDataArray[0],certDataArray[1],certDataArray[2],certDataArray[3],certDataArray[4],certDataArray[5])

现在,问题是 findall 这个函数无法匹配第二个“until:\s(.*)\n”的模式,因为已经有一个相同的匹配了。我不太确定我这样说是否准确,但你大概明白我的意思。

我在网上查找解决方案,找到了两个:

1) 使用新的改进版 Python 正则表达式模块。这种方法不行,因为我不是在我的电脑上运行这个代码,而是要在一个企业级的平台上运行。升级 Python 的可能性不大,我也不认为我可以简单地把 regex.py 复制到服务器上让那里的 Python 使用它,对吧?我下载了这个包,似乎需要安装,而我在这个系统上是不能进行安装的。

2) re.iterate。我看了一下,但老实说,我不太明白它是怎么工作的。

我也尝试把字符串分解成行,然后用“for”循环遍历每一行,但这看起来像是个笨办法,可能会带来很大的问题。

欢迎任何想法,谢谢。

1 个回答

1

这并不是因为它是重复匹配——第二行并没有'\n'结尾。你其实应该使用:

  • r"原始字符串",这样可以防止转义字符搞混;
  • 正则表达式中的字符串结束标记$,而不是\n
  • 还有re.MULTILINE选项,这样可以把每一行当作单独的内容来处理。

例如:

>>> s = """Valid from: Wed Mar 05 15:40:45 GMT+00:00 2014 until: Thu Jan 05 08:28:29 GMT+00:00 2034
Valid from: Fri Jan 10 08:28:29 GMT+00:00 2014 until: Thu Jan 05 08:28:29 GMT+00:00 2034"""
>>> import re
>>> re.findall(r'until:\s(.*)$', s, re.MULTILINE)
['Thu Jan 05 08:28:29 GMT+00:00 2034', 'Thu Jan 05 08:28:29 GMT+00:00 2034']

撰写回答