2015-04-30 3 views
0

Я работаю с Regex, и я новичок в использовании python. Я не могу заставить программу читать из файла и правильно проверять соответствие. Я получаю ошибку обратное прослеживание, что выглядит следующим образом:Python - U.S. ZipCode Matching

Traceback (most recent call last): 
    File "C:\Users\Systematic\workspace\Project8\src\zipcode.py", line 18, in <module> 
     m = re.match(info, pattern) 
    File "C:\Python34\lib\re.py", line 160, in match 
     return _compile(pattern, flags).match(string) 
    File "C:\Python34\lib\re.py", line 282, in _compile 
     p, loc = _cache[type(pattern), pattern, flags] 
TypeError: unhashable type: 'list' 

zipin.txt:

3285 
32816 
32816-2362 
32765-a234 
32765-23 
99999-9999 

zipcode.py:

from pip._vendor.distlib.compat import raw_input 
import re 

userinput = raw_input('Please enter the name of the file containing the input zipcodes: ') 

myfile = open(userinput) 

info = myfile.readlines() 

pattern = '^[0-9]{5}(?:-[0-9]{4})?$' 

m = re.match(info, pattern) 

if m is not None: 
    print("Match found - valid U.S. zipcode: " , info, "\n") 
else: print("Error - no match - invalid U.S. zipcode: ", info, "\n") 

myfile.close() 
+1

Я думаю, что у вас есть аргументы включен в 're.match'. – Shashank

+0

Добро пожаловать в StackOverflow. Вы заметите, что ваш вопрос был отредактирован, чтобы улучшить форматирование и сделать его более читаемым. Вам будет лучше получить ответы быстрее, если ваши сообщения будут чистыми и краткими. Существует общее руководство (http://stackoverflow.com/help/how-to-ask) к тому, как это сделать. Для вопросов, связанных с python, убедитесь, что трассировка стека напечатана чисто, так как часто используется диагностика ключа при чтении неработающего кода. – amccormack

+1

Одним из способов избежать переключения аргументов в 're.match' является компиляция ваших регулярных выражений, как @Ami в сообщении ответа. См. [Этот пост] (http://stackoverflow.com/questions/452104/is-it-worth-using-pythons-re-compile) для других преимуществ для компиляции ваших регулярных выражений. – amccormack

ответ

1

Проблема заключается в том, что readlines() возвращает список, а re - на материал, похожий на строку. Вот один из способов это может работать:

import re 

zip_re = re.compile('^[0-9]{5}(?:-[0-9]{4})?$') 

for l in open('zipin.txt', 'r'): 
    m = zip_re.match(l.strip()) 
    if m: 
     print l 
     break 
if m is None: 
    print("Error - no match") 

Теперь код работает в цикле над файловыми линиями, и пытается соответствовать повторно на раздели версию каждой строки.

Edit:

Это на самом деле можно записать это в гораздо короче, хотя и менее ясным образом:

next((l for l in open('zipin.txt', 'r') if zip_re.match(l.strip())), None)