Vérifiez si la chaîne correspond au modèle


317

Comment vérifier si une chaîne correspond à ce modèle?

Lettre majuscule, chiffre (s), lettre majuscule, chiffre (s) ...

Exemple, ceux-ci correspondraient:

A1B2
B10L1
C1N200J1

Ce ne serait pas le cas ('^' indique un problème)

a1B2
^
A10B
   ^
AB400
^

3
pourriez-vous s'il vous plaît expliquer plus en détail pourquoi c'est un problème?
John Woo

4
^([A-Z]\d+){1,}$comme ça?
Passerby

Dans votre troisième exemple, le problème devrait être avec Bet non avec A.
Burhan Khalid

c'est peut-être une erreur de frappe sur le problème. les deux Aet Bles petites lettres sont-elles exactes? A10bet aB400?
John Woo

@Burhan, Le problème est avec A parce que B a des numéros à côté et A non
DanielTA

Réponses:


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

Modifier: Comme indiqué dans les commentaires match, ne vérifie que les correspondances au début de la chaîne tandis que re.search()correspondra à un modèle n'importe où dans la chaîne. (Voir aussi: https://docs.python.org/library/re.html#search-vs-match )


20
A partir de la documentation sur re.match: If zero or more characters at the beginning of string match the regular expression pattern. J'ai juste passé environ 30 minutes à essayer de comprendre pourquoi je ne pouvais pas faire correspondre quelque chose à la fin d'une chaîne. On dirait que ce n'est pas possible avec match, n'est-ce pas? Pour cela, ça re.search(pattern, my_string)marche quand même.
conradkleinespel

2
@conradk Oui, vous avez raison, je pense qu'il y a quelque chose comme un implicite ^au début lorsque vous utilisez match. Je pense que c'est un peu plus compliqué que cette explication très simple, mais je ne suis pas clair. Vous avez raison, cependant, cela commence au début de la chaîne.
CrazyCasta

173

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

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

Vous pouvez l’évaluer boolsi nécessaire

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

Manquant import rela première ligne
Arod

C'est bizarre. Pourquoi pouvez-vous utiliser re.matchdans le contexte d'un if, mais vous devez utiliser boolsi vous l'utilisez ailleurs?
LondonRob

16
Attention à re.match. Il ne correspond qu'au début d'une chaîne. Jetez un oeil à la re.searchplace.
LondonRob

@LondonRob probablement parce ifque la correspondance n'est pas vérifiée None.
Dennis

Il y a un grand besoin de compiler pour s'assurer qu'il n'y a pas d'erreurs dans les expressions régulières comme les erreurs de plage de mauvais caractères
Suh Fangmbeng

36

S'il vous plaît essayez ce qui suit:

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
C'est le seul cas qui renvoie la correspondance requise pour obtenir des groupes. Meilleure réponse à mon avis.
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

les expressions régulières rendent cela facile ...

[A-Z] correspondra exactement à un caractère entre A et Z

\d+ correspondra à un ou plusieurs chiffres

() grouper des choses (et aussi renvoyer des choses ... mais pour l'instant, pensez à les regrouper)

+ sélectionne 1 ou plus


6
  
import re

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


Je crois que cela devrait fonctionner pour un modèle de nombre majuscule .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.