搜索用蟒正则表达式
问题描述:
我正在做一个简单的命令行的Python程序一整行,并确认与一个拼写检查用户的输入。我在之前发现了http://norvig.com/spell-correct.html,并且正在使用它来验证我的用户将输入的内容。就我而言,我正在根据BART站列表验证用户输入。用户必须准确输入电台名称,或从拼写检查器获取建议。以下是我正在验证的BART电台列表。搜索用蟒正则表达式
Lake Merritt
Daly City
Fruitvale
Coliseum/Oakland Airport
San Leandro
.
.
.
我在做什么和示例代码,我发现,是我对验证多个words-“达利城”,而不是仅仅之间的区别“Fruitvale。”我用正则表达式和python不太好,我试图弄清楚如何读取每一行,并检查从行首到结尾的所有内容。所以我很难找出正则表达式来读取一行中的所有内容。以下是我正在试图改变代码:
def words(text): return re.findall('[a-z]+', text.lower())
其中文本是
我试图
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
我真的不知道如何做到这一点。谁能帮忙?
答
也许使用difflib
,而不是弱势族群的拼写校正。 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:
+0
谢谢,这似乎工作,是一个非常简单,直接的解决方案。 – 2013-02-18 02:51:51
什么're.findall( '[AZ] +'' – 2013-02-18 02:02:10
在你给第二种情况下're.search'列表 – placeybordeaux 2013-02-18 02:02:14
正则表达式只能在一行文本中工作,所以你要么使用'map'或'for'循环来遍历整个列表,然后可以返回所有列表的另一个列表匹配 – supercheetah 2013-02-18 02:09:23