python re.findall不匹配重复项
假设输入的数据是这样的。实际上它更长,但为了清晰起见,我就留这样。
有效期从: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']