2012-06-13 96 views
1

我不知道這是爲什麼不工作:Python的正則表達式愁楚

import re 
import csv 

def check(q, s): 
    match = re.search(r'%s' % q, s, re.IGNORECASE) 
    if match: 
    return True 
    else: 
    return False 

tstr = [] 

# test strings 
tstr.append('testthisisnotworking') 
tstr.append('This is a TEsT') 
tstr.append('This is a TEST mon!') 

f = open('testwords.txt', 'rU') 
reader = csv.reader(f) 
for type, term, exp in reader: 
    for i in range(2): 
    if check(exp, tstr[i]): 
     print exp + " hit on " + tstr[i] 
    else: 
     print exp + " did NOT hit on " + tstr[i] 
f.close() 

testwords.txt包含此行:

blah, blah, test 

所以基本上 '測試' 是正則表達式。沒什麼複雜的,只是一個簡單的詞。這裏的輸出:

test did NOT hit on testthisisnotworking 
test hit on This is a TEsT 
test hit on This is a TEST mon! 

爲什麼它沒有擊中第一個字符串?我也試過\s*test\s*沒有運氣。幫幫我?

+0

我不知道python,但我知道正則表達式。你可以縮小它只是一個正則表達式的潛在問題嗎? http://worksol.be/regex.html – buckley

+0

「Python正則表達式困境」。這給了我一個小笑。我覺得你,正則表達式可能是可悲的。 – jlafay

回答

3

print repr(exp)添加到第一個for循環的頂部顯示exp' test',請注意最前面的空格。

這並不令人驚奇,因爲在逗號csv.reader()拆分,請嘗試更改您的代碼如下:

for type, term, exp in reader: 
    exp = exp.strip() 
    for s in tstr: 
    if check(exp, s): 
     print exp + " hit on " + s 
    else: 
     print exp + " did NOT hit on " + s 

需要注意的是,除了strip()通話將刪除前面一個尾隨空白,我改變你的第二個循環只是直接在tstr的字符串上循環,而不是在一個範圍內。當前代碼中實際存在一個錯誤,因爲tstr包含三個值,但您只檢查前兩個值,因爲for i in range(2)只會給您i=0i=1

+0

謝謝!我感謝您的幫助! – Dan

6

csv模塊默認返回輸入中單詞周圍的空格(這可以通過使用不同的「方言」來更改)。所以exp包含" test"與領先的空間。

一個快速的方法來解決這個問題是添加:

exp = exp.strip() 

你從CSV文件中讀取後。

+0

'strip'一直是避免這種情況下的驚喜的好朋友。我會說這是一個很好的習慣,總是使用它(不會傷害) – heltonbiker

+0

謝謝!我感謝您的幫助! – Dan