搜索用蟒正则表达式

问题描述:

我正在做一个简单的命令行的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 

我真的不知道如何做到这一点。谁能帮忙?

+0

什么're.findall( '[AZ] +'' – 2013-02-18 02:02:10

+2

在你给第二种情况下're.search'列表 – placeybordeaux 2013-02-18 02:02:14

+0

正则表达式只能在一行文本中工作,所以你要么使用'map'或'for'循环来遍历整个列表,然后可以返回所有列表的另一个列表匹配 – supercheetah 2013-02-18 02:09:23

也许使用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