Разные результаты между grep и python с одним и тем же оператором регулярных выражений - PullRequest
1 голос
/ 24 марта 2020

Почему один и тот же оператор регулярного выражения получает другой результат между Python и grep?

Моя входная строка выглядит следующим образом:

оператор или комментарий должны отображаться в случае по умолчанию [MISRA 2012, правило 16.1, обязательно], [MISRA 2012, правило 16.4, обязательно]

Цель состоит в том, чтобы найти [MISRA 2012, правило 16.1, обязательно] и [ MISRA 2012 Правило 16.4, требуется] от regex.

Используя код, приведенный ниже в Python,

onelineStr = "statement or comment should appear in default case [MISRA 2012 Rule 16.1, required], [MISRA 2012 Rule 16.4, required]"
r1 = re.findall(r"\[MISRA.*?\]", onelineStr)
print (r1)

, результат показан ниже, что является моим ожиданием .

['[MISRA 2012 Rule 16.1, required]', '[MISRA 2012 Rule 16.4, required]']

Однако, когда я использую то же выражение регулярного выражения в grep. Ничего не могу найти.

grep -o --color "\[MISRA.*?\]" 1.txt

Содержимое 1.txt - это заявление или комментарий, которые должны отображаться в случае по умолчанию [MISRA 2012, правило 16.1, обязательно], [MISRA 2012, правило 16.4, обязательно]

Что-то не так?

Спасибо !!

1 Ответ

2 голосов
/ 24 марта 2020

Шаблон ленивых точек .*? соответствует любому 0 или более символам (кроме символов разрыва строки) как можно меньше, но ленивые квантификаторы не поддерживаются в регулярных выражениях POSIX.

Вам нужно использовать [^][]* in grep в паттерне POSIX BRE, чтобы соответствовать нулю или большему числу символов, кроме ] и [:

grep -o --color "\[MISRA[^][]*]" 1.txt

На самом деле, тот же шаблон может быть используется в Python re тоже.

[^][]* является примером «умного размещения» специальных символов внутри выражения в скобках (выражения в скобках POSIX не допускают escape-последовательности регулярного выражения).

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