Diferencia entre '.' , '?' y '*' en expresiones regulares?

Diferencia entre '.' , '?' y '*' en expresiones regulares?

¿Podría darme un ejemplo de en qué se diferencian estos tres elementos (¿se llaman metacaracteres?).

Sé que eso *significa todo o nada, pero no estoy seguro de si es la forma correcta de pensarlo. Por otro lado .y ?parecen lo mismo. Coinciden con un personaje, ¿verdad?

Respuesta1

Puede que estés confundiendoexpresiones regularesconglobos de concha

En la sintaxis de una expresión regular .representa cualquier carácter (generalmente excluyendo el carácter de nueva línea), mientras que *es uncuantificadores decir, cero o más del átomo de expresión regular anterior (carácter o grupo). ?es un cuantificador que significa cero ounoinstancias del átomo anterior, o (en variantes de expresiones regulares que lo admitan) unmodificadorque establece el comportamiento del cuantificador como no codicioso.

En Shell globs, ?representa un solo carácter (como la expresión regular .) mientras que *representa una secuencia de cero o más caracteres (equivalente a la expresión regular .*).

Un par de referencias que pueden resultarle útiles sonhttp://www.regular-expressions.info/quickstart.htmlyhttp://mywiki.wooledge.org/glob

Respuesta2

Tomado directamente deWikipedia:

? El signo de interrogación indica cero o una aparición del elemento anterior. Por ejemplo, color coincide con "color" y "color".

*El asterisco indica cero o más apariciones del elemento anterior. Por ejemplo, ab*c coincide con "ac", "abc", "abbc", "abbbc", etc.

La gran diferencia es que el asterisco coincidecero o másocurrencias, mientras que el signo de interrogación coincidecero o unoocurrencia. Compare estos dos ejemplos:

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

Debido a que en colouurla letra u (el elemento anterior antes del calificador ?) apareció más de una vez, no coincide con ?, pero sí coincide con*

Ejemplo similar:

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

De la misma página de wikipedia:

Coincide con cualquier carácter (muchas aplicaciones excluyen las nuevas líneas, y exactamente qué caracteres se consideran nuevas líneas son específicos del tipo, la codificación de caracteres y la plataforma, pero es seguro asumir que el carácter de salto de línea está incluido). Dentro de las expresiones entre corchetes POSIX, el carácter de punto coincide con un punto literal. Por ejemplo, ac coincide con "abc", etc., pero [ac] coincide sólo con "a", "." o "c".

En nuestro ejemplo,

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

Muy apropiadamente, el último dice comomatch any line that has "colou", plus any character, plus letter "r"

Conclusión

Has preguntado: "Sé que '*' significa todo o nada, pero no estoy seguro de si es la forma correcta de pensarlo. Por otro lado, '." & '?' parece igual." Como puedes ver, el punto y el asterisco no son exactamente iguales. El punto opera sobre cualquier carácter que pueda estar ocupando esa posición específica, mientras que el signo de interrogación opera sobre el elemento anterior.

Respuesta3

Nota: Examples provided are in Python.Aunque el concepto sigue siendo el mismo.

'.'es unsímbolo coincidenteque coincide con cualquier carácter exceptocarácter de nueva línea(Esto también se puede anular con re.DOTALLun argumento en Python). De ahí que también se le llame comoComodín.

'*'es uncuantificador(define con qué frecuencia puede ocurrir un elemento). es corto para{0,}.

Significa“coincide con cero o más”—El grupo que precede a la estrella puede aparecer cualquier número de veces en el texto. Puede estar completamente ausente o repetirse una y otra vez.

'?'también es uncuantificador. es corto para{0,1}.

Significa"Coincide con cero o uno del grupo que precede a este signo de interrogación".También se puede interpretar comola parte que precede al signo de interrogación es opcional.

p.ej:

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'

En el ejemplo anterior '?' indica que los dos dígitos que lo preceden son opcionales. Pueden no aparecer o aparecer como máximo una vez.

Diferencia entre '.' y '?':

'.'coincide/acepta/verificacualquier personajepara el lugar que ocupa en la expresión regular.

p.ej:

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

'?'coincide/verifica la ocurrencia única o nula delgrupo que lo precede.

Consulte el ejemplo de número de móvil.

Lo mismo ocurre con '*'. lo comprobarácero o más apariciones del grupo que lo precede.

Combinación:

'.*': Acepta tantas secuencias como estén disponibles.Enfoque codicioso.

'.*?' Acepta la primera secuencia coincidente y se detiene.Enfoque no codicioso

Para obtener más información, considere leer las siguientes dos preguntas...

información relacionada