1

我不确定为什么这不起作用:

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*没有运气。帮助?

4

2 回答 2

6

默认情况下,该csv模块在输入中的单词周围返回空格(可以通过使用不同的“方言”来更改)。所以exp包含" test"前导空格。

解决此问题的一种快速方法是添加:

exp = exp.strip()

从 CSV 文件中读取后。

于 2012-06-13T20:36:05.190 回答
3

在第一个循环的print repr(exp)顶部添加 afor表示,注意前导空格。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=0i=1.

于 2012-06-13T20:37:47.840 回答