python re.findall与重复项不匹配

时间:2014-09-03 15:20:23

标签: python regex findall

让我们假设输入是这样的。实际上它更长,但为了清楚起见,我会留下这样的。

  

有效期:格林威治标准时间3月3日15:40:45 2014年+ 00:00直至:周一1月05日08:28:29 GMT + 00:00 0034
  有效期:星期五1月10日08:28:29格林尼治标准时间+ 2014年00:00直至:周一1月05日08:28:29 GMT + 00:00 0034

这是我的代码:

 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”,因为已经存在相同的匹配。不确定我是否正确地说了,但你明白了。

我一直在谷歌搜索解决方案,发现2:

1)使用新改进的python regex模块。这不在桌面上,因为我没有在我的PC上运行它,这个代码将在企业级平台上运行。以任何方式升级python都不太可能,我不认为我可以将regex.py复制粘贴到服务器中以使python在那里使用它,或者我可以吗?我下载了软件包,似乎需要安装,我不允许在这个系统上进行安装。

2)re.iterate。一直在看它,坦率地说我不明白它是如何工作的

我还尝试将字符串分解为行并使用“for”循环遍历每一行,但这似乎是一种可能适得其反的延迟方法。

非常欢迎所有的想法,谢谢。

1 个答案:

答案 0 :(得分:1)

这不是因为它是重复匹配 - 第二行'\n'结尾。你真的应该使用:

  • r"raw strings"以防止逃脱混乱;
  • 正则表达式字符串结束标记$而不是\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']