2012-06-13 56 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