2014-09-03 65 views
0

让我们假设输入是这样的。实际上它更长,但为了清晰起见,我会这样离开它。python re.findall不匹配副本

有效期从:周三3月5日十五点40分45秒GMT + 00:00 2014至:周四年1月5 8点28分29秒GMT + 00:00 2034
有效期从:周五08年1月10日:28:29 GMT + 00:00 2014至:周四年1月5 8时28分29秒GMT + 00:00 2034

这里是我的代码:

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不会匹配t他第二次匹配模式“直到:\ s(。*)\ n”,因为已经有相同的匹配。不知道我是否正确表达了意思,但你明白了。

我一直在使用Google的解决方案,并发现2:

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

2)重复。一直在看它,并坦率地说,我不明白它是如何工作的

我也试图将字符串分解成行并使用“for”来循环每一行,但这似乎是一个延迟的方法,可以适得其反。

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

回答

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'] 
+0

的确不错,如果添加到re.MULTILINE re.compile(模式,re.MULTILINE)和$用来代替\ n,则它的工作原理。然而,我仍然不完全明白多线的作用。你可以解释吗? 此外,何时需要将字母'r'放在图案前面,何时不放? – 2014-09-03 19:20:06

+0

您是否阅读过文档?这是清楚的解释。 – jonrsharpe 2014-09-03 19:21:57

+0

我不明白为什么我需要在这种情况下分别对待每一行,如果我试图匹配的模式不在多行上运行,它不会从一行开始,并在另一行结束。 – 2014-09-04 20:21:02