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

使用python正则表达式搜索整行,python,regex,Python,Regex,我正在制作一个简单的命令行python程序,并使用拼写检查器验证用户输入。我很早就在上找到了,并且正在使用它来验证我的用户将输入什么。在我的例子中,我正在根据BART站点列表验证用户输入。用户必须准确输入电台名称,或者从拼写检查器获得建议。下面是我正在验证的BART站点列表 Lake Merritt Daly City Fruitvale Coliseum/Oakland Airport San Leandro . . . 我所做的与我找到的示例代码之间的区别在于,我在验证多个单词——“Dal

我正在制作一个简单的命令行python程序,并使用拼写检查器验证用户输入。我很早就在上找到了,并且正在使用它来验证我的用户将输入什么。在我的例子中,我正在根据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
回溯(最近一次呼叫最后一次):
文件“spell.py”,第15行,在
NWORDS=train(单词(文件('stations.txt').read())
文件“spell.py”,第6行,大写
返回重新搜索(“[a-z]+”,行)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py”,搜索中的第142行
返回编译(模式、标志)。搜索(字符串)
TypeError:应为字符串或缓冲区

我真的不知道该怎么做。有人能帮忙吗?

也许用
difflib
代替诺维格的拼写更正器
difflib
有一个功能,可以帮助您猜测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: 

也许可以使用
difflib
代替诺维格的拼写更正器
difflib
有一个功能,可以帮助您猜测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: 

那么
re.findall('[a-z]+“
?在第二种情况下,您给了
re.search
一个字符串列表。正则表达式只对一行文本起作用,因此您可以使用
map
循环来遍历整个列表,然后您可以返回另一个所有匹配项的列表。
re.findall('[a-z]+“
?在第二种情况下,您给了
re.search
一个字符串列表。正则表达式只能在一行文本上工作,因此您可以使用
map
循环来遍历整个列表,然后您可以返回另一个所有匹配项的列表。谢谢,这似乎很有效,而且非常简单e、 直截了当的解决方案。谢谢,这似乎有效,而且是一个非常简单、直截了当的解决方案。