2016-11-29 2 views
0
regular_expression = re.compile(r'SKIPPED|PASSED|FAILED') 
regular_expression.search(line) 

выше регулярное выражение будет выбраны все строки, которые имеют один из слов (пропускаются | ПРОШЛО | FAILED)Python: Как соответствовать только одно из слов, используя регулярное выражение

Проблема заключается в: Он выбирает нижняя строка также

TYPE TOTAL SKIPPED  PASSED FAILED 
---- ----- -------  ------ ------ 

Module 21  0   19  3 

Так их способ, чтобы он выбирал линию только в том случае, если присутствует одно из трех слов?

+1

Это действительно проще без регулярных выражений. Посмотрите на ['^ (? :(! ПРОПУСКАЕТСЯ | ПРОШЕДШИЕ | НЕИСПРАВНОСТИ).) * (?: ПРОПУСТИТЬ | ПРОШЕДШИЕ | НЕИСПРАВНО) (?!. * (?: ПРОПУСТИТЬ | ПРОШЕДШИЕ | НЕИСПРАВНО))'] (https://regex101.com/r/oo2kOi/1). –

+0

@ WiktorStribiżew: Умный гольф с этим там. Получает +1 от меня. –

+0

@SebastianLenartowicz: * lookahead * в выражении является частью так называемого [* tempered greedy token *] (http://www.rexegg.com/regex-quantifiers.html#tempered_greed). –

ответ

1

Никто здравомыслящий бы рекомендовал делать это с помощью регулярных выражений в рабочем коде, но для полноты картины, вот ответ с помощью positive and negative lookaheads:

^(?:(?=.*PASSED)(?!.*(?:FAILED|SKIPPED))|(?=.*FAILED)(?!.*(?:PASSED|SKIPPED))|(?=.*SKIPPED)(?!.*(?:FAILED|PASSED))) 

В принципе, то, что он будет делать это смотреть вперед, чтобы убедиться, что строка содержит любое одно из слов, которое вы хотите, затем смотрите вперед, чтобы убедиться, что он не содержит ни одного из двух других.

Demo on Regex101

1

как об использовании re.findall вместо и проверить только 1 матч пункта, матча только Истинный когда re.findall возврата только один элемент матча

regular_expression = re.compile(r'SKIPPED|PASSED|FAILED') 
match = len(regular_expression.findall(line)) == 1 
Смежные вопросы