2014-09-03 73 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