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