Нахождение Шаблона Regex после выполнения re.findall

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

REGEX_PATTERN = '|'.join(self.error_patterns.keys())

где self.error_patterns.keys() был бы шаблон как

: error:  
: warning:
cc1plus: 
undefine reference to
Failure:  

и сделайте

error_found = re.findall(REGEX_PATTERN,line) 

Теперь, когда я выполняю его против некоторого файла, который мог бы содержать один или несколько, чем шаблоны, как я знаю то, чему точно соответствовал шаблон? Я подразумеваю, что могу так или иначе видеть строку вручную и узнать это, но хотеть знать, могу ли после выполнения re.findall я узнать шаблон как re.group () или что-то

Спасибо

1
задан daydreamer 30 July 2010 в 18:43
поделиться

2 ответа

re.findall вернет все части текста, которые соответствуют вашему выражению.

Если этого недостаточно для однозначной идентификации шаблона, вы можете повторно выполнить re.match/re.find для отдельных подшаблонов, которые вы объединили()ed. Во время применения вашего первоначального регулярного выражения, программа сравнения уже не знает, что вы составили его из нескольких подшаблонов, поэтому она не может предоставить более подробную информацию о том, какой подшаблон совпал.

Другой, не менее громоздкий вариант - заключить каждый шаблон в группу (...). Тогда re.findall вернет массив значений None (для всех несовпадающих шаблонов), за исключением одной группы, которая совпала с шаблоном.

1
ответ дан 2 September 2019 в 22:33
поделиться

MatchObject имеет свойство lastindex , которое содержит индекс последней группы захвата, которая участвовала в сопоставлении. Если вы заключите каждый шаблон в отдельную группу захвата, например:

(: error:)|(: warning:)

... lastindex сообщит вам, какой из них соответствует (при условии, что вы знаете порядок, в котором шаблоны появляются в регулярном выражении). Вероятно, вы захотите использовать finditer () (который создает итератор MatchObjects) вместо findall () (который возвращает список строк). Кроме того, убедитесь, что в регулярном выражении нет других групп захвата, чтобы индексирование не синхронизировалось.

1
ответ дан 2 September 2019 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: