我不确定为什么这不起作用:
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'是RegEx模式。没有什么复杂的,只是一个简单的词。这是输出:
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 :(得分:6)
默认情况下,csv
模块会在输入中的单词周围返回空格(这可以通过使用不同的“方言”来更改)。因此exp
包含带有前导空格的" test"
。
解决此问题的一种快速方法是添加:
exp = exp.strip()
从CSV文件中读取后。
答案 1 :(得分: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()
调用之外,我还会将第二个for循环更改为直接循环遍历tstr
中的字符串而不是一个范围。您当前的代码中确实存在一个错误,因为tstr
包含三个值,但您只检查了前两个,因为for i in range(2)
只会为您提供i=0
和i=1
。