Controlla se la stringa corrisponde al modello


317

Come posso verificare se una stringa corrisponde a questo modello?

Lettera maiuscola, numero (i), lettera maiuscola, numero (i) ...

Esempio, corrisponderebbero a:

A1B2
B10L1
C1N200J1

Questi non sarebbero ('^' indica il problema)

a1B2
^
A10B
   ^
AB400
^

3
potresti per favore spiegare di più perché è un problema?
John Woo,

4
^([A-Z]\d+){1,}$come questo?
Passerby,

Nel tuo terzo esempio, il problema dovrebbe essere con Be non con A.
Burhan Khalid,

forse è un errore di battitura sul problema. entrambi Ae Bsono lettere minuscole giusto? A10be aB400?
John Woo,

@Burhan, Il problema è con A perché B ha dei numeri accanto e A no
DanielTA,

Risposte:


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

Modifica: come notato nei commenti, matchcontrolla solo le corrispondenze all'inizio della stringa mentre re.search()corrisponderà a un modello in qualsiasi punto della stringa. (Vedi anche: https://docs.python.org/library/re.html#search-vs-match )


20
Dalla documentazione su re.match: If zero or more characters at the beginning of string match the regular expression pattern. Ho trascorso solo 30 minuti a cercare di capire perché non riuscivo a trovare una corrispondenza alla fine di una stringa. Sembra che non sia possibile match, vero? Per quello, re.search(pattern, my_string)funziona comunque.
Conradkleinespel,

2
@conradk Sì, hai ragione, penso che ci sia qualcosa di simile a un implicito ^all'inizio quando lo usi match. Penso che sia un po 'più complicato di quella spiegazione molto semplice, ma non sono chiaro. Hai ragione, però, che inizia dall'inizio della stringa.
CrazyCasta,

173

One-liner: re.match(r"pattern", string) # No need to compile

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

Puoi valutarlo come boolse necessario

>>> bool(re.match(r"hello[0-9]+", 'hello1'))
True

Manca import recome prima riga
iniziato il

Quello è strano. Perché puoi usare re.matchnel contesto di un if, ma devi usarlo boolse lo stai usando altrove?
Londra,

16
Attento con re.match. Corrisponde solo all'inizio di una stringa. Dai un'occhiata re.searchinvece.
Londra,

@LondonRob probabilmente perché non ifverifica la corrispondenza None.
Dennis,

C'è una grande necessità di compilare per assicurarsi che non ci siano errori nelle espressioni regolari come errori nella gamma di caratteri errati
Suh Fangmbeng

36

Si prega di provare quanto segue:

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
Questo è l'unico caso che restituisce la corrispondenza richiesta per ottenere gruppi. La migliore risposta secondo me.
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

le espressioni regolari lo rendono facile ...

[A-Z] corrisponderà esattamente a un carattere tra A e Z

\d+ corrisponderà a una o più cifre

() raggruppare le cose (e anche restituire le cose ... ma per ora basta pensare a loro raggruppando)

+ seleziona 1 o più


6
  
import re

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


Credo che dovrebbe funzionare per un modello numerico maiuscolo .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.