Compruebe si la cadena coincide con el patrón

317

¿Cómo verifico si una cadena coincide con este patrón?

Letra mayúscula, número (s), letra mayúscula, número (s) ...

Ejemplo, estos coincidirían:

A1B2
B10L1
C1N200J1

Estos no ('^' apunta al problema)

a1B2
^
A10B
   ^
AB400
^
DanielTA
fuente
3
¿podría explicar más por qué es un problema?
John Woo
44
^([A-Z]\d+){1,}$¿Me gusta esto?
Passerby
En su tercer ejemplo, el problema debería ser con By no con A.
Burhan Khalid
tal vez es un error tipográfico en el problema. ambos Ay Bson minúsculas ¿verdad? A10by aB400?
John Woo
@Burhan, el problema es con A porque B tiene números al lado y A no
DanielTA

Respuestas:

465
import re
pattern = re.compile("^([A-Z][0-9]+)+$")
pattern.match(string)

Editar: como se señaló en los comentarios match, solo se comprueban las coincidencias al comienzo de la cadena, mientras re.search()que coincidirá con un patrón en cualquier lugar de la cadena. (Ver también: https://docs.python.org/library/re.html#search-vs-match )

CrazyCasta
fuente
20
A partir de los documentos en re.match: If zero or more characters at the beginning of string match the regular expression pattern. Pasé como 30 minutos tratando de entender por qué no podía hacer coincidir algo al final de una cadena. Parece que no es posible con match, ¿verdad? Sin re.search(pattern, my_string)embargo , para eso funciona.
conradkleinespel
2
@conradk Sí, tienes razón, creo que hay algo así como implícito ^al principio cuando lo usas match. Creo que es un poco más complicado que esa explicación muy simple, pero no estoy claro. Sin embargo, tienes razón en que comienza desde el principio de la cadena.
CrazyCasta
173

Un trazador de líneas: re.match(r"pattern", string) # No need to compile

import re
>>> if re.match(r"hello[0-9]+", 'hello1'):
...     print('Yes')
... 
Yes

Puedes evaluarlo como boolsea ​​necesario

>>> bool(re.match(r"hello[0-9]+", 'hello1'))
True
nehem
fuente
Desaparecido import recomo la primera línea
arod
Eso es raro. ¿Por qué puedes usarlo re.matchen el contexto de un if, pero tienes que usarlo boolsi lo estás usando en otro lugar?
LondonRob
16
Cuidado con re.match. Solo coincide al comienzo de una cadena. Echa un vistazo a su re.searchlugar.
LondonRob
@LondonRob probablemente porque ifverifica que no haya coincidencia None.
Dennis
Hay una gran necesidad de compilar para asegurarse de que no haya errores en las expresiones regulares como errores de rango de caracteres incorrectos
Suh Fangmbeng
36

Por favor intenta lo siguiente:

import re

name = ["A1B1", "djdd", "B2C4", "C2H2", "jdoi","1A4V"]

# Match names.
for element in name:
     m = re.match("(^[A-Z]\d[A-Z]\d)", element)
     if m:
        print(m.groups())
sumeet agrawal
fuente
1
Este es el único caso que devuelve la coincidencia que se requiere para obtener grupos. La mejor respuesta en mi opinión.
Rick Smith
24
import re
import sys

prog = re.compile('([A-Z]\d+)+')

while True:
  line = sys.stdin.readline()
  if not line: break

  if prog.match(line):
    print 'matched'
  else:
    print 'not matched'
Marc Cohen
fuente
7

las expresiones regulares hacen que esto sea fácil ...

[A-Z] coincidirá exactamente con un personaje entre A y Z

\d+ coincidirá con uno o más dígitos

() agrupar cosas (y también devolver cosas ... pero por ahora solo piense en ellas agrupando)

+ selecciona 1 o más

Joran Beasley
fuente
6
  
import re

ab = re.compile("^([A-Z]{1}[0-9]{1})+$")
ab.match(string)
  


Creo que debería funcionar para un patrón de mayúsculas y números .

Arrodíllate ante Zod
fuente