Verifique se a string corresponde ao padrão

317

Como verifico se uma sequência corresponde a esse padrão?

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

Exemplo, estes corresponderiam a:

A1B2
B10L1
C1N200J1

Estes não ('^' aponta para o problema)

a1B2
^
A10B
   ^
AB400
^
DanielTA
fonte
3
você poderia explicar mais porque é um problema?
John Woo
4
^([A-Z]\d+){1,}$como isso?
Passerby
No seu terceiro exemplo, o problema deve estar com Be não com A.
Burhan Khalid
talvez seja um erro de digitação no problema. ambos Ae Bsão letras pequenas, certo? A10be aB400?
John Woo
@Burhan, O problema é com A como B tem números junto a ele e A não faz
DanielTA

Respostas:

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

Editar: conforme observado nos comentários, matchverifica apenas correspondências no início da sequência, enquanto re.search()corresponderá a um padrão em qualquer lugar da sequência. (Veja também: https://docs.python.org/library/re.html#search-vs-match )

CrazyCasta
fonte
20
De docs em re.match: If zero or more characters at the beginning of string match the regular expression pattern. Passei apenas 30 minutos tentando entender por que não consegui encontrar algo no final de uma string. Parece que não é possível match, não é? Para isso, re.search(pattern, my_string)funciona embora.
conradkleinespel
2
@conradk Sim, você está certo, acho que há algo como um implícito ^no início quando você usa match. Eu acho que é um pouco mais complicado do que essa explicação muito simples, mas não estou claro. Você está certo de que ele começa desde o início da string.
11136 CrazyCasta
173

Uma linha: re.match(r"pattern", string) # No need to compile

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

Você pode avaliá-lo como boolse necessário

>>> bool(re.match(r"hello[0-9]+", 'hello1'))
True
nehem
fonte
Faltando import recomo primeira linha
arod 19/01/19
Isso é estranho. Por que você pode usar re.matchno contexto de um if, mas precisa usá- boollo se estiver usando em outro lugar?
LondonRob
16
Cuidado com re.match. Corresponde apenas no início de uma string. Dê uma olhada em seu re.searchlugar.
LondonRob
@LondonRob provavelmente porque a ifverificação não está ocorrendo None.
Dennis
Há uma grande necessidade de compilação para garantir que não haja erros nas expressões regulares, como erros de intervalo de caracteres ruins
Suh Fangmbeng
36

Por favor, tente o seguinte:

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
fonte
1
Este é o único caso que retorna a correspondência necessária para obter grupos. Melhor resposta na minha opinião.
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
fonte
7

expressões regulares facilitam isso ...

[A-Z] corresponderá exatamente a um caractere entre A e Z

\d+ corresponderá a um ou mais dígitos

() agrupar coisas (e também devolver coisas ... mas, por enquanto, apenas pense nelas)

+ seleciona 1 ou mais

Joran Beasley
fonte
6
  
import re

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


Acredito que isso funcione para um padrão numérico maiúsculo .

Ajoelhe-se diante de Zod
fonte