Ü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
^

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 )


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

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())

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'

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


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 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.