使用python正则表达式搜索整行

时间:2013-02-18 02:00:24

标签: python regex

我正在创建一个简单的命令行python程序,并使用拼写检查器验证用户输入。我之前在SO上找到http://norvig.com/spell-correct.html,并使用它来验证用户将输入的内容。就我而言,我正在根据BART站列表验证用户输入。用户必须准确输入电台名称,或从拼写检查器中获取建议。以下是我正在验证的BART电台列表。

Lake Merritt
Daly City
Fruitvale
Coliseum/Oakland Airport
San Leandro
.
.
.

我正在做的和我发现的示例代码之间的区别在于,我正在验证多个单词 - “Daly City”而不仅仅是“Fruitvale”。我对regex和python并不是很了解,我正在试图弄清楚如何读取每一行,并检查从行的开头到结尾的所有内容。因此,我无法找出正则表达式来读取一行中的所有内容。这是我要改变的代码:

def words(text): return re.findall('[a-z]+', text.lower()) 

其中text是示例中使用的大文本文件

我试过

def words(text):
  lines=text.split('\n')
  return re.search('[a-z]+', lines)

认为这样可行,因为(至少对我而言)意味着我在每行搜索一个字符串中至少一个小写字母。但是,我得到了这个回复

Traceback (most recent call last):
File "spell.py", line 15, in <module>
NWORDS = train(words(file('stations.txt').read()))
File "spell.py", line 6, in words
return re.search('[a-z]+', lines)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py",       line 142, in search
return _compile(pattern, flags).search(string)
TypeError: expected string or buffer

我不确定该怎么做。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

也许使用difflib而不是Norvig的拼写纠正器。 difflib具有get_close_matches功能,可以帮助您猜测BART电台中哪个字符串最接近用户输入的字符串。例如,

import difflib

bart_stations = ['Lake Merritt', 'Daly City', 'Fruitvale', 'Coliseum/Oakland Airport',
                 'San Leandro']

while True:
    text = raw_input('Enter BART station: ')
    if not text: break  # Pressing Enter quits
    guess = difflib.get_close_matches(text, bart_stations, n=1, cutoff=0)[0]
    print('Closest match: {g}'.format(g = guess))

运行脚本会产生:

% test.py
Enter BART station: Merit
Closest match: Lake Merritt
Enter BART station: Fruity
Closest match: Fruitvale
Enter BART station: Coli
Closest match: Daly City
Enter BART station: Col
Closest match: Coliseum/Oakland Airport
Enter BART station: Lean
Closest match: San Leandro
Enter BART station: