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
^

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 )


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

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

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'

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


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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.