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
^

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 )


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

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())

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'

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


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 .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.