2011-01-24 2 views
0

Я пишу подходящую функцию, и мне интересно, могу ли я вернуть только первое совпадение. Вот мой код (который соответствует всем экземплярам URL для данной линии, а не только первый) ... это, прежде чем я попытался выбрать один матч:, возвращающий один экземпляр содержимого объекта регулярного выражения

def file_match(line, url): 
    allmatches = re.search(r'<a href="(?P<url>.*?)"', line) 
    if allmatches and allmatches.groupdict()['url'] == url: 
     return allmatches.groupdict()['url'] 
    else: 
     return None 

Кто-нибудь есть опыт работы с эта конкретная проблема? Мне было рекомендовано использовать метод .sub через объект regex, но я действительно не могу сказать, что я буду использовать для аргументов этого метода. Я пробовал несколько вещей, но все они дают ошибки.

Вот пример одной из таких (неудачных) попыток:

def file_match(line, url): 
    allmatches = re.search(r'<a href="(?P<url>.*?)"', line) 
    if allmatches and allmatches.groupdict()['url'] == url: 
     return re.sub(r'<a href="(?P<url>.*?)"', allmatches, 1) 
    else: 
     return None 

Есть проблема, что я использую метод .search()?

Любые советы будут оценены.

Спасибо, JML

+0

Это соответствует * все * экземпляры шаблона, и я хотел бы, чтобы он соответствует только * один * - я обновил свой вопрос включить попытку. – jml

+0

Просьба уточнить, что вы подразумеваете под «Вот мой код (который работает):«. Вы говорите, что это не работает? Что ты говоришь, точно? –

+0

Как вы заметите выше, я обновил свой вопрос. Что сейчас непонятно? Первый бит кода выполняет, но в результате получается много совпадений на строку (если их больше одного). Второй - попытка выделить первый матч, который я не знаю, как это сделать. – jml

ответ

0

еще одно обновление.
извините за беспокойство, но я думаю, что это оказалось моей ошибкой. когда я использовал line.replace(), я не использовал правильную строку поиска, а только тест для модуля re, который является слишком общим с точки зрения того, что я хотел сопоставить.

Вот ответ, который закончился фиксируя мою проблему:

line.replace('<a href="' + test_str + '">', '<a href="' + re_string + '">') 
0

Я думаю, что вам нужно сделать немного больше чтения на Match Objects.

В частности Groups.

Надеюсь, это поможет.

+0

Я пробовал использовать следующее: allmatches.group (1) ... но это тоже не работает. Он по-прежнему дает несколько совпадений. – jml

+0

К сожалению, я просто не могу даже начать воспроизводить поведение, о котором вы говорите, извините! :( – William

Смежные вопросы