Разница между «.», «?» и «*» в регулярных выражениях?

Разница между «.», «?» и «*» в регулярных выражениях?

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

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

решение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']

'?'сопоставляет/проверяет нулевое или единственное вхождениегруппа, предшествующая ему.

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

То же самое касается '*'. Он проверитноль или более вхождений предшествующей ему группы.

Комбинация:

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

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

Для получения более подробной информации прочитайте следующие два вопроса...

Связанный контент