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
^
DanielTA
la source
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 )

CrazyCasta
la source
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
nehem
la source
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())
sumeet agrawal
la source
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'
Marc Cohen
la source
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

Joran Beasley
la source
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 .

Agenouillez-vous devant zod
la source