2015-01-26 5 views
0

Я пытаюсь создать сценарий, который позволит пользователю вводить ряд регулярных выражений, которые будут проходить через входной файл и получать совпадения. В настоящее время я использую ahocorasick, но у меня возникают проблемы, когда я пытаюсь вводить шаблоны с регулярным выражением.Использование регулярных выражений в исходном входе python

Я ввести регулярное выражение во второй raw_input (colour_regex), но получить эту ошибку ниже:

Traceback (most recent call last): 
    File "PLA_Enrichment_options.py", line 189, in <module> 
    main() 
    File "PLA_Enrichment_options.py", line 41, in main 
    tree.add(regex) 
    File "build/bdist.linux-x86_64/egg/ahocorasick/__init__.py", line 29, in add 

TypeError: argument 1 must be string or read-only buffer, not _sre.SRE_Pattern 

file_name = raw_input("What is the filename you wish to enhance? ") 
enhanced_name = file_name.replace(".csv", "") 

# User regexed input 
tree = ahocorasick.KeywordTree() 
print ("What regex would you like to use for colour? (Enter 'exit' to move on) ") 
colour_regex = raw_input() 
regex = re.compile(colour_regex) 
while colour_regex != "exit": 
    tree.add(regex) 
tree.make() 

print 'Finding colour matches...' 
output = open(enhanced_name + '-colour.csv', 'w') 
file = open(feed_name, 'r') 
for line in iter(file): 
    id, title, desc, link, image = line.strip('\n').split('\t') 
    offerString = '|'.join([title.lower(), desc.lower(), link.lower()]) 
    keywords = set() 
    for match in tree.findall_long(offerString): # find colours 
     indices = list(match) 
     keyword = offerString[indices[0]:indices[1]] 
     if re.search(r'(?<![âêîôûäëïöüàèìòùáéíóú])\b%s\b(?![âêîôûäëïöüàèìòùáéíóú])' %(keyword), offerString): 
      keywords.add(keyword)          
    if keywords: 
     output.write('\t'.join([id, '|'.join(keywords), desc, link, image])+'\n') 
    else: 
     output.write('\t'.join([id, title, desc, link, image])+'\n') 
file.close() 
output.close() 

Любая помощь/руководство в правильном направлении было бы здорово.

Благодаря

+0

Какие у вас проблемы с этой программой? Где это происходит? –

+0

Когда я вводил регулярное выражение при первом запросе на цвет, я получаю эту ошибку: TypeError: аргумент 1 должен быть строковым или только для чтения, а не _sre.SRE_Pattern – user2320229

+1

. Пожалуйста, добавьте полное сообщение об ошибке (с номером строки) в вопрос. –

ответ

1
tree = ahocorasick.KeywordTree() 
regex = re.compile(colour_regex) 
tree.add(regex) 

Вы прошли неправильный тип для ahocorasick.KeywordTree.add()

regex представляет собой скомпилированный объект регулярного выражения. Тип: _sre.SRE_Pattern. Если вместо этого вы используете исходную строку, вы не получите эту ошибку.

tree.add(colour_regex) 

Кроме того, это вызовет бесконечный цикл. Я думаю, вы хотите if вместо while, или положить colour_regex = raw_input() внутри цикла.

while colour_regex != "exit": 
+0

Спасибо за ваш комментарий. Я установил бесконечный цикл. Я больше не получаю ошибку выше, и скрипт заканчивается. Однако входящие в него регулярные выражения, похоже, не действуют как регулярные выражения, так как я не получаю ожидаемого результата. Например, в файле я запускаю скрипт, потому что у меня есть «красное цветочное платье», поэтому, если я войду в красное (*) платье регулярного выражения, я хочу получить обратно все спички к этому регулярному выражению. – user2320229

+0

Не знаю. Попытайтесь изолировать проблемный код в функции, чтобы вы могли протестировать его изолированно. Если вы все еще не можете найти ошибку, вы должны опубликовать ее как новый вопрос. –