Sprawdź, czy łańcuch pasuje do wzorca

317

Jak sprawdzić, czy ciąg znaków pasuje do tego wzoru?

Wielkie litery, cyfry, wielkie litery, cyfry ...

Przykład, będą pasować:

A1B2
B10L1
C1N200J1

Nie byłyby („^” wskazuje na problem)

a1B2
^
A10B
   ^
AB400
^
DanielTA
źródło
3
czy mógłbyś wyjaśnić więcej, dlaczego jest to problem?
John Woo
4
^([A-Z]\d+){1,}$lubię to?
Passerby
W twoim trzecim przykładzie problem powinien dotyczyć, Ba nie być A.
Burhan Khalid
może jest to błąd literowy w tym problemie. oba Ai Bczy małe litery są w porządku? A10bi aB400?
John Woo
@Burhan, Problem dotyczy A, ponieważ B ma liczby obok, a A nie
DanielTA

Odpowiedzi:

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

Edycja: Jak zauważono w komentarzach, matchsprawdza tylko dopasowania na początku łańcucha, a re.search()dopasuje wzór w dowolnym miejscu łańcucha. (Zobacz także: https://docs.python.org/library/re.html#search-vs-match )

CrazyCasta
źródło
20
Od docs na re.match: If zero or more characters at the beginning of string match the regular expression pattern. Po prostu spędziłem około 30 minut, próbując zrozumieć, dlaczego nie mogłem dopasować czegoś na końcu łańcucha. Wydaje się, że to niemożliwe match, prawda? Do tego re.search(pattern, my_string)jednak działa.
conradkleinespel,
2
@conradk Tak, masz rację, myślę, że ^na początku jest coś takiego jak domniemane, kiedy używasz match. Myślę, że to trochę bardziej skomplikowane niż to bardzo proste wytłumaczenie, ale nie jestem do końca pewien. Masz jednak rację, że zaczyna się od początku łańcucha.
CrazyCasta
173

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

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

Możesz to ocenić w boolrazie potrzeby

>>> bool(re.match(r"hello[0-9]+", 'hello1'))
True
nehem
źródło
Brakuje import rejako pierwszego wiersza
arod
To jest dziwne. Dlaczego możesz używać re.matchw kontekście if, ale musisz użyć, booljeśli używasz go w innym miejscu?
LondonRob
16
Ostrożnie z re.match. Pasuje tylko na początku łańcucha. re.searchZamiast tego spójrz na .
LondonRob
@LondonRob prawdopodobnie dlatego, że nie ifsprawdza dopasowania None.
Dennis
Konieczna jest kompilacja, aby upewnić się, że nie ma błędów w wyrażeniach regularnych, takich jak błędy zakresu znaków
Suh Fangmbeng
36

Spróbuj wykonać następujące czynności:

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
źródło
1
Jest to jedyny przypadek, który zwraca dopasowanie wymagane do uzyskania grup. Najlepsza odpowiedź według mnie.
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
źródło
7

wyrażenia regularne ułatwiają to ...

[A-Z] dopasuje dokładnie jeden znak między A i Z

\d+ dopasuje jedną lub więcej cyfr

() grupuj rzeczy (a także zwracaj rzeczy ... ale na razie pomyśl o grupowaniu)

+ wybiera 1 lub więcej

Joran Beasley
źródło
6
  
import re

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


Uważam, że powinno to działać z wielkimi, liczbowymi wzorami liczbowymi .

Klęczeć przed Zod
źródło