Различие между, '?' и '*' в регулярных выражениях?

Я мог получить пример относительно того, как эти три элемента (их называют метасимволами?) отличаются?

Я знаю это * средства все или ничего, но я не уверен - ли это правильный способ думать об этом. С другой стороны, . и ? кажусь тем же. Они соответствуют одному символу, правильно?

21
задан 9 September 2016 в 05:58

3 ответа

Взятый прямо от Википедия :

? вопросительный знак указывает на нуль или случаи предыдущего элемента. Например, colou? r соответствует и "цвету" и "цвету".

* звездочка указывает на нуль или больше случаев предыдущего элемента. Например, ab*c соответствует "ac", "abc", "abbc", "abbbc", и так далее.

большая разница - то, что звездочка соответствует нуль или больше случаи, в то время как вопросительный знак соответствует нуль или один возникновение. Сравните эти два примера:

$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'                          
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'                          
colour
color
colouur

, поскольку в colouur буква U (предыдущий элемент перед спецификатором ?) произошла несколько раз, это не соответствует ?, но это соответствует *

Подобный пример:

$ printf "error\neror\ner\n" | egrep 'er?or'                                   
eror
$ printf "error\neror\ner\n" | egrep 'er*or'                                   
error
eror
<час>

От той же страницы Википедии:

Соответствия любой отдельный символ (много приложений исключают новые строки, и точно какие символы считают новыми строками, является разновидностью - символьное кодирование - и определенный для платформы, но безопасно предположить, что символ перевода строки включен). В рамках выражений скобки POSIX точечный символ соответствует литеральной точке. Например, a.c соответствует "abc", и т.д., но [a.c] соответствует только "a", ".", или "c".

В нашем примере,

$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'                           
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'                          
colouur

Соответственно достаточно, последний читает как match any line that has "colou", plus any character, plus letter "r"

Заключение

, которое Вы спросили: "Я знаю, что '*' означает все или ничего, но я не уверен - ли это правильный способ думать об этом. На другом '.' &'?' кажусь тем же". Как Вы видите, точка и звездочка не являются точно тем же. Точка воздействует на любой символ, который может занимать то определенное положение, в то время как вопросительный знак воздействует на предыдущий элемент.

16
ответ дан 23 November 2019 в 01:38

Примечание: Examples provided are in Python. Хотя понятие остается тем же.

'.' символ соответствия, который соответствует любому символу за исключением символа новой строки (это также может быть переопределено с re.DOTALL аргумент в Python). Следовательно это также называют как Подстановочный знак.

'*' квантор (определяет, как часто элемент может произойти). Коротко для {0}.

Это означает “нуль соответствия или больше” — группа, которая предшествует, звезда может произойти любое количество раз в тексте. Это может абсолютно отсутствовать или может быть повторно много раз.

'?' также квантор. Коротко для {0,1}.

Это означает "Нуль соответствия или одну из группы, предшествующей этому вопросительному знаку". Это может также быть интерпретировано, поскольку часть, предшествующая вопросительному знаку, дополнительная.

например:

pattern = re.compile(r'(\d{2}-)?\d{10}')
mobile1 = pattern.search('My number is 91-9999988888')
mobile1.group()
Output: '91-9999988888'

mobile2 = pattern.search('My number is 9999988888')
mobile2.group()
Output: '9999988888'

В вышеупомянутом примере'?' указывает, что эти две цифры, предшествующие ему, являются дополнительными. Они не могут произойти или произойти самое большее однажды.

Различие между и'?':

'.' соответствует/принимает/проверяет любому отдельному символу для места, которое он содержит в регулярном выражении.

например:

pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']

'?' соответствует/проверяет нулевому или отдельному проявлению группы, предшествующей ему.

Проверьте пример Номера мобильного телефона.

То же идет с '*'. Это проверит нуль или больше случаев группы, предшествующей ему.

Комбинация:

'.*': Принимает, что столько же упорядочивает сколько доступный. Жадный подход.

'.*?'Принимает первую подобранную последовательность и остановки. Нежадный подход

Для большего количества информации рассмотрите чтение после двух вопросов...

6
ответ дан 23 November 2019 в 01:38

Можно путать регулярные выражения с шариками оболочки

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

В шариках оболочки, ? представляет отдельный символ (как regex's .) в то время как * представляет последовательность нуля или большего количества символов (эквивалентный regex .*).

Несколькими ссылками, которые можно найти полезным, является http://www.regular-expressions.info/quickstart.html и http://mywiki.wooledge.org/glob

32
ответ дан 23 November 2019 в 01:38

Другие вопросы по тегам:

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