用Python正则表达式搜索整行

1 投票
1 回答
807 浏览
提问于 2025-04-17 16:13

我正在制作一个简单的命令行Python程序,并用拼写检查器来验证用户输入。我在StackOverflow上找到了一些资料,网址是http://norvig.com/spell-correct.html,并用它来检查用户输入的内容。在我的情况下,我是用一份BART车站的名单来验证用户输入。用户必须准确输入车站的名称,否则就会得到拼写检查器的建议。以下是我用来验证的BART车站名单。

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

我所做的和我找到的示例代码之间的区别在于,我要验证的是多个单词,比如“Daly City”,而不仅仅是“Fruitvale”。我对正则表达式和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 个回答

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: 

撰写回答