2012-10-17 26 views
0

我只是測試了一個小型的Python腳本,我將其用於更大的腳本中。基本上我試圖查找一個CSV文件中的字段(它包含一個正則表達式),並在正則表達式測試中使用它。原因是(非常奇怪的用例的一部分),並且將使維護CSV文件更容易,而不是腳本。有什麼我用下面的失蹤....Python:使用CSV中存儲的正則表達式

test.csv:

field0,field1,field2 
foo,bar,"\d+\.\d+" 
bar,foo,"\w+" 

test.py(用於測試額外print的):

import sys 
import re 
import csv 

input = sys.argv[1] 
print input 

reader = csv.reader(open('test.csv','rb'), delimiter=',', quotechar="\"") 
for row in reader: 
     print row 
     value = row[0] 
     print value 
     if value in input: 
       regex = row[2] 
       print regex 

       pat = re.compile(regex) 
       test = re.match(pat,input) 
       out = test.group(1) 
       print out 

如果我傳遞像「foo blah 38902462986.328946239846」這樣的值給腳本,我希望這會得到它包含foo,然後使用正則表達式\d+\.\d+來提取38902462986.328946239846。但是,當我運行該腳本,我得到以下內容:

foo blah 0920390239.90239029 
['field0', 'field1', 'field2'] 
field0 
['foo', 'bar', '\\d+\\.\\d+'] 
foo 
\d+\.\d+ 
Traceback (most recent call last): 
    File "reg.py", line 19, in <module> 
    out = test.group(1) 
AttributeError: 'NoneType' object has no attribute 'group' 

不確定發生了什麼事情。

P.S Python是一個大世界仍然學習。

+2

你的代碼看起來不正確idented。如果test爲None,則re.match失敗(這是失敗時返回的結果)。這可能是因爲re.match期望一個字符串作爲第一個參數,而不是編譯模式。 – cdleonard

回答

1

根據文檔re.match匹配輸入字符串的開頭。您需要使用re.search。另外,如果以後不重複使用,則不需要編譯。只要說test = re.search(regex, input)

在您的示例中的正則表達式中,您沒有任何捕獲組,因此test.group(1)將會失敗,即使input中存在匹配。

import sys 
import re 
import csv 

input = 'foo blah 38902462986.328946239846' 

reader = csv.reader(open('test.csv','rb'), delimiter=',', quotechar="\"") 
for row in reader: 
    value = row[0] 
    if value in input: 
     regex = row[2] 
     test = re.search(regex, input) 
     print input[test.start():test.end()] 

打印:

38902462986.328946239846 
+0

謝謝,這是做的伎倆,這可能是因爲我以前使用過匹配,所以卡在我的腦海裏。 – MHibbin