Поиск шаблона регулярных выражений после выполнения re.findall - PullRequest
1 голос
/ 30 июля 2010

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

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 () или что-то еще

Спасибо

Ответы [ 2 ]

1 голос
/ 31 июля 2010

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

(: error:)|(: warning:)

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

1 голос
/ 30 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...