Différence entre '.' , '?' et '*' dans les expressions régulières?

21

Puis-je obtenir un exemple de la différence entre ces trois éléments (sont-ils appelés métacaractères?)?

Je sais que cela *signifie tout ou rien, mais je ne sais pas si c'est la bonne façon d'y penser. D'un autre côté .et ?semblent les mêmes. Ils correspondent à un personnage, non?

posixKing
la source

Réponses:

16

Tiré directement de Wikipedia :

? Le point d'interrogation indique zéro ou une occurrence de l'élément précédent. Par exemple, colou? R correspond à la fois à "couleur" et à "couleur".

*L'astérisque indique zéro ou plusieurs occurrences de l'élément précédent. Par exemple, ab * c correspond à "ac", "abc", "abbc", "abbbc", etc.

La grande différence est que l'astérisque correspond à zéro ou plusieurs occurrences, tandis que le point d'interrogation correspond à zéro ou une occurrence. Comparez ces deux exemples:

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

Parce que dans colouurla lettre u (l'élément précédent avant le qualificatif ?) s'est produit plus d'une fois, il n'est pas associé à ?, mais il est associé à*

Exemple similaire:

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

De la même page wikipedia:

Correspond à n'importe quel caractère (de nombreuses applications excluent les sauts de ligne, et exactement quels caractères sont considérés comme des sauts de ligne sont spécifiques à la saveur, au codage des caractères et à la plate-forme, mais il est sûr de supposer que le caractère de saut de ligne est inclus). Dans les expressions entre crochets POSIX, le caractère point correspond à un point littéral. Par exemple, ac correspond à "abc", etc., mais [ac] correspond uniquement à "a", "." Ou "c".

Dans notre exemple,

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

De façon appropriée, le dernier se lit comme suit: match any line that has "colou", plus any character, plus letter "r"

Conclusion

Vous avez demandé: "Je sais que" * "signifie tout ou rien, mais je ne sais pas si c'est la bonne façon d'y penser. De l'autre". " & '?' semblent identiques. " Comme vous pouvez le voir, le point et l'astérisque ne sont pas exactement les mêmes. Le point opère sur n'importe quel caractère qui peut occuper cette position spécifique, tandis que le point d'interrogation opère sur l'élément précédent.

Sergiy Kolodyazhnyy
la source
32

Vous pouvez confondre les expressions régulières avec les globes shell

Dans une expression régulière, la syntaxe .représente n'importe quel caractère unique (généralement à l'exclusion du caractère de nouvelle ligne), tandis *qu'un quantificateur signifie zéro ou plus de l'atome d' expression régulière précédent (caractère ou groupe). ?est un quantificateur signifiant zéro ou une instance de l'atome précédent, ou (dans les variantes d'expression régulière qui le prennent en charge) un modificateur qui définit le comportement du quantificateur sur non gourmand.

Dans les globes shell, ?représente un seul caractère (comme les regex .) tandis que *représente une séquence de zéro ou plusieurs caractères (équivalent à regex .*).

Quelques références que vous pouvez trouver utiles sont http://www.regular-expressions.info/quickstart.html et http://mywiki.wooledge.org/glob

tournevis
la source
6

Remarque: bien Examples provided are in Python.que le concept reste le même.

'.'est un symbole correspondant qui correspond à n'importe quel caractère à l'exception du caractère de nouvelle ligne (cela peut également être remplacé par un re.DOTALLargument en Python). Par conséquent, il est également appelé Wildcard .

'*'est un quantificateur (définit la fréquence à laquelle un élément peut se produire). Est l'abréviation de {0,} .

Cela signifie «correspondre à zéro ou plus» - le groupe qui précède l'étoile peut apparaître un certain nombre de fois dans le texte. Il peut être complètement absent ou répété encore et encore.

'?'est également un quantificateur . Est l'abréviation de {0,1} .

Cela signifie «Correspond à zéro ou à l'un des groupes précédant ce point d'interrogation». Il peut également être interprété comme la partie précédant le point d'interrogation est facultative .

par exemple:

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'

Dans l'exemple ci-dessus '?' indique que les deux chiffres qui le précèdent sont facultatifs. Ils peuvent ne pas se produire ou se produire au maximum une fois.

Différence entre '.' et '?':

'.'correspond / accepte / vérifie tout caractère unique pour la place qu'il tient dans l'expression régulière.

par exemple:

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

'?'correspond / vérifie l'occurrence nulle ou unique du groupe qui le précède .

Consultez l'exemple de numéro de mobile.

Il en va de même '*'. Il vérifiera zéro ou plusieurs occurrences du groupe qui le précède .

Combinaison:

'.*': Accepte autant de séquences que disponibles. Approche gourmande .

'.*?'Accepte la première séquence correspondante et s'arrête. Approche non gourmande

Pour plus d'informations, pensez à lire les deux questions suivantes ...

Dhaval Simaria
la source