Überprüfen Sie, ob die Zeichenfolge mit dem Muster übereinstimmt

315

Wie überprüfe ich, ob eine Zeichenfolge mit diesem Muster übereinstimmt?

Großbuchstaben, Nummer (n), Großbuchstabe, Nummer (n) ...

Beispiel: Diese würden übereinstimmen:

A1B2
B10L1
C1N200J1

Diese würden nicht ('^' deutet auf ein Problem hin)

a1B2
^
A10B
   ^
AB400
^
DanielTA
quelle
3
Könnten Sie bitte mehr erklären, warum es ein Problem ist?
John Woo
4
^([A-Z]\d+){1,}$so was?
Passant
In Ihrem dritten Beispiel sollte das Problem mit Bund nicht mit sein A.
Burhan Khalid
Vielleicht liegt ein Tippfehler am Problem vor. beides Aund Bsind kleine Buchstaben richtig? A10bund aB400?
John Woo
@ Burhan, das Problem ist mit A, weil B Zahlen daneben hat und A nicht
DanielTA

Antworten:

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

Bearbeiten: Wie in den Kommentaren angegeben match, wird nur nach Übereinstimmungen am Anfang der Zeichenfolge gesucht, während re.search()ein Muster an einer beliebigen Stelle in der Zeichenfolge übereinstimmt. (Siehe auch: https://docs.python.org/library/re.html#search-vs-match )

CrazyCasta
quelle
20
Aus den Dokumenten auf re.match: If zero or more characters at the beginning of string match the regular expression pattern. Ich habe gerade 30 Minuten lang versucht zu verstehen, warum ich am Ende einer Zeichenfolge nichts finden konnte. Scheint, als wäre das nicht möglich match, oder? Dafür re.search(pattern, my_string)funktioniert es aber.
Conradkleinespel
2
@conradk Ja, du hast recht, ich denke, es gibt so etwas wie eine implizite ^am Anfang, wenn du verwendest match. Ich denke, es ist etwas komplizierter als diese sehr einfache Erklärung, aber ich bin nicht klar. Sie haben Recht, dass es am Anfang der Zeichenfolge beginnt.
CrazyCasta
173

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

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

Sie können es boolnach Bedarf bewerten

>>> bool(re.match(r"hello[0-9]+", 'hello1'))
True
nehem
quelle
Fehlt import reals erste Zeile
am
Das ist komisch. Warum können Sie re.matchim Kontext von verwenden if, aber Sie müssen verwenden, boolwenn Sie es anderswo verwenden?
LondonRob
16
Vorsicht mit re.match. Es stimmt nur am Anfang einer Zeichenfolge überein. Schauen Sie sich re.searchstattdessen an.
LondonRob
@ LondonRob wahrscheinlich, weil ifprüft, ob das Match nicht stimmt None.
Dennis
Es muss dringend kompiliert werden, um sicherzustellen, dass die regulären Ausdrücke keine Fehler enthalten, wie z. B. fehlerhafte Zeichenbereichsfehler
Suh Fangmbeng,
36

Bitte versuche folgendes:

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
quelle
1
Dies ist der einzige Fall, der die Übereinstimmung zurückgibt, die zum Abrufen von Gruppen erforderlich ist. Beste Antwort meiner Meinung nach.
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
quelle
7

reguläre Ausdrücke machen dies einfach ...

[A-Z] entspricht genau einem Zeichen zwischen A und Z.

\d+ stimmt mit einer oder mehreren Ziffern überein

() Gruppieren Sie Dinge (und geben Sie auch Dinge zurück ... aber denken Sie vorerst nur an Gruppieren)

+ wählt 1 oder mehr aus

Joran Beasley
quelle
6
  
import re

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


Ich glaube, das sollte für ein Großbuchstaben- Zahlenmuster funktionieren .

Knie vor dem ZOD
quelle