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.