grep
не поддерживает группы без захвата регулярных выражений Python.Когда вы пишете что-то вроде (?:\w+\W+)
, вы спрашиваете grep
, что соответствует вопросительному знаку ?
, за которым следует двоеточие :
, за которым следует один или несколько символов слова \w+
, за которыми следует один или несколько несловарных символов \W+
.?
- это специальный символ для grep
регулярных выражений, конечно, но поскольку он следует за началом группы, он автоматически экранируется (так же, как регулярное выражение [?]
соответствует знаку вопроса).
Давайте проверим это?У меня есть следующий файл:
$ cat file
This is perhaps the easiest place to add new functionality.
grep
не совпадает с используемым выражением:
$ grep -ERHn "\beasiest\W+(?:\w+\W+){1,10}?new\b" file
Затем я создал следующий файл:
$ cat file2
This is perhaps the easiest ?:place ?:to ?:add new functionality.
Обратите внимание, что каждому слову предшествует ?:
.В этом случае ваше выражение соответствует файлу:
$ grep -ERHn "\beasiest\W+(?:\w+\W+){1,10}?new\b" file2
file2:1:This is perhaps the easiest ?:place ?:to ?:add new functionality.
Решение состоит в том, чтобы удалить ?:
выражения:
$ grep -ERHn "\beasiest\W+(\w+\W+){1,10}?new\b" file
file:1:This is perhaps the easiest place to add new functionality.
Поскольку вам даже не нужнозахват группы (по крайней мере, насколько я видел) не несет никаких проблем.
Бонусный балл : вы можете упростить выражение своего лица, изменив {1,10}
на {0,10}
и удаливследующие ?
:
$ grep -ERHn "\beasiest\W+(\w+\W+){0,10}new\b" file
file:1:This is perhaps the easiest place to add new functionality.