Я мог получить пример относительно того, как эти три элемента (их называют метасимволами?) отличаются?
Я знаю это *
средства все или ничего, но я не уверен - ли это правильный способ думать об этом. С другой стороны, .
и ?
кажусь тем же. Они соответствуют одному символу, правильно?
Взятый прямо от Википедия :
? вопросительный знак указывает на нуль или случаи предыдущего элемента. Например, 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"
Заключение
, которое Вы спросили: "Я знаю, что '*' означает все или ничего, но я не уверен - ли это правильный способ думать об этом. На другом '.' &'?' кажусь тем же". Как Вы видите, точка и звездочка не являются точно тем же. Точка воздействует на любой символ, который может занимать то определенное положение, в то время как вопросительный знак воздействует на предыдущий элемент.
Примечание: 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']
'?'
соответствует/проверяет нулевому или отдельному проявлению группы, предшествующей ему.
Проверьте пример Номера мобильного телефона.
То же идет с '*'
. Это проверит нуль или больше случаев группы, предшествующей ему.
Комбинация:
'.*'
: Принимает, что столько же упорядочивает сколько доступный. Жадный подход.
'.*?
'Принимает первую подобранную последовательность и остановки. Нежадный подход
Для большего количества информации рассмотрите чтение после двух вопросов...
Можно путать регулярные выражения с шариками оболочки
В синтаксисе регулярного выражения .
представляет любой отдельный символ (обычно, исключая символ новой строки), в то время как *
нуль значения квантора или больше предыдущего regex атома (символ или группа). ?
нуль значения квантора или экземпляры предыдущего атома, или (в regex вариантах, которые поддерживают его), модификатор, который устанавливает поведение квантора на нежадный.
В шариках оболочки, ?
представляет отдельный символ (как regex's .
) в то время как *
представляет последовательность нуля или большего количества символов (эквивалентный regex .*
).
Несколькими ссылками, которые можно найти полезным, является http://www.regular-expressions.info/quickstart.html и http://mywiki.wooledge.org/glob