Differenza fra '.' , "?" e '*' in espressioni regolari?


21

Potrei fare un esempio di come questi tre elementi (sono chiamati metacaratteri?) Differiscono?

So che *significa tutto o niente, ma non sono sicuro che sia il modo giusto di pensarci. D'altra parte .e ?sembrano uguali. Abbinano un personaggio, giusto?



Risposte:


16

Tratto direttamente da Wikipedia :

? Il punto interrogativo indica zero o una occorrenza dell'elemento precedente. Ad esempio, colou? R corrisponde sia a "color" che a "color".

*L'asterisco indica zero o più occorrenze dell'elemento precedente. Ad esempio, ab * c corrisponde a "ac", "abc", "abbc", "abbbc" e così via.

La grande differenza è che l'asterisco corrisponde a zero o più occorrenze, mentre il punto interrogativo corrisponde a zero o una occorrenza. Confronta questi due esempi:

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

Perché nella colouurlettera u (l'elemento precedente prima del qualificatore ?) si è verificato più di una volta, non è abbinato ?, ma è abbinato a*

Esempio simile:

$ printf "error\neror\ner\n" | egrep 'er?or'                                   
eror
$ printf "error\neror\ner\n" | egrep 'er*or'                                   
error
eror

Dalla stessa pagina di Wikipedia:

Corrisponde a qualsiasi singolo carattere (molte applicazioni escludono le nuove righe e esattamente quali caratteri sono considerati le nuove righe sono specifici per sapore, codifica dei caratteri e piattaforma specifica, ma è lecito ritenere che il carattere di avanzamento riga sia incluso). Nelle espressioni parentesi POSIX, il carattere punto corrisponde a un punto letterale. Ad esempio, ac corrisponde a "abc", ecc., Ma [ac] corrisponde solo a "a", "." O "c".

Nel nostro esempio,

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

Abbastanza opportunamente, l'ultimo recita come match any line that has "colou", plus any character, plus letter "r"

Conclusione

Mi hai chiesto: "So che '*' significa tutto o niente, ma non sono sicuro che sia il modo giusto di pensarci. Dall'altro '.' & '?' sembra lo stesso ". Come puoi vedere, il punto e l'asterisco non sono esattamente gli stessi. Il punto opera su qualsiasi personaggio che può occupare quella posizione specifica, mentre il punto interrogativo opera sull'elemento precedente.


32

Potresti confondere le espressioni regolari con i globs di shell

Nell'espressione regolare la sintassi .rappresenta ogni singolo carattere (di solito escluso il carattere di nuova riga), mentre *è un quantificatore che significa zero o più dell'atomo regex precedente (carattere o gruppo). ?è un quantificatore che significa zero o una istanza dell'atomo precedente o (nelle varianti regex che lo supportano) un modificatore che imposta il comportamento del quantificatore su non avido.

In globs shell, ?rappresenta un singolo personaggio (come quello di regex .) mentre *rappresenta una sequenza di zero o più caratteri (equivalente a regex .*).

Un paio di riferimenti che potresti trovare utili sono http://www.regular-expressions.info/quickstart.html e http://mywiki.wooledge.org/glob


6

Nota: Examples provided are in Python.sebbene il concetto rimanga lo stesso.

'.'è un simbolo corrispondente che corrisponde a qualsiasi carattere ad eccezione del carattere di nuova riga (anche questo può essere sostituito con re.DOTALLargomento in Python). Quindi viene anche chiamato Wildcard .

'*'è un quantificatore (definisce la frequenza con cui un elemento può verificarsi). È l'abbreviazione di {0,} .

Significa "corrisponde a zero o più": il gruppo che precede la stella può verificarsi un numero qualsiasi di volte nel testo. Può essere completamente assente o ripetuto più volte.

'?'è anche un quantificatore . È l'abbreviazione di {0,1} .

Significa "Match zero o uno del gruppo che precede questo punto interrogativo". Può anche essere interpretato come la parte che precede il punto interrogativo è facoltativa .

per esempio:

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'

Nell'esempio sopra "?" indica che le due cifre che la precedono sono opzionali e potrebbero non verificarsi o verificarsi al massimo una volta.

Differenza fra '.' e '?':

'.'corrisponde / accetta / verifica ogni singolo carattere per il posto che sta nell'espressione regolare.

per esempio:

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

'?'confronta / verifica lo zero o la singola occorrenza del gruppo che lo precede .

Controlla l'esempio del numero di cellulare.

Lo stesso vale per '*'. Controllerà zero o più occorrenze del gruppo che lo precede .

Combinazione:

'.*': Accetta tutte le sequenze disponibili. Approccio avido .

'.*?'Accetta la prima sequenza abbinata e si ferma. Approccio non avido

Per maggiori informazioni, considera di leggere le seguenti due domande ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.