Перевірте, чи відповідає рядок шаблону


317

Як перевірити, чи відповідає рядок даному шаблону?

Великі літери, цифри, великі літери, цифри ...

Наприклад, вони відповідають:

A1B2
B10L1
C1N200J1

Це не буде ("^" вказує на проблему)

a1B2
^
A10B
   ^
AB400
^

3
Ви можете, будь ласка, пояснити більше, чому це проблема?
Джон Ву

4
^([A-Z]\d+){1,}$подобається це?
Перехожий

У вашому третьому прикладі проблема повинна бути з, Bа не з A.
Бурхан Халід

можливо, це помилка друку щодо проблеми. і те, Aі Bмаленькі літери так? A10bі aB400?
Джон Ву

@Burhan, Проблема з А тому , що B має номера поруч з ним і не
DanielTA

Відповіді:


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

Редагувати: Як зазначено в коментарях, matchперевіряється лише відповідність на початку рядка, тоді як re.search()відповідність шаблону в будь-якому місці рядка (Дивіться також: https://docs.python.org/library/re.html#search-vs-match )


20
З документів на re.match: If zero or more characters at the beginning of string match the regular expression pattern. Я просто провів 30 хвилин, намагаючись зрозуміти, чому я не зміг щось зіставити в кінці струни. Здається, це неможливо match, чи не так? Для цього re.search(pattern, my_string)працює, хоча.
conradkleinespel

2
@conradk Так, ти маєш рацію, я думаю, що щось подібне мається ^на увазі під час використання match. Я думаю, що це трохи складніше, ніж це дуже просте пояснення, але мені не ясно. Ви вірні, що він починається з початку рядка.
CrazyCasta

173

Одноколісний: re.match(r"pattern", string) # No need to compile

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

Ви можете оцінити це так, як boolпотрібно

>>> bool(re.match(r"hello[0-9]+", 'hello1'))
True

Відсутній import reяк перший рядок
арод

Це дивно. Чому ви можете використовувати re.matchв контексті if, але ви повинні використовувати, boolякщо ви використовуєте його в іншому місці?
LondonRob

16
Обережно з re.match. Він збігається лише на початку рядка. Погляньте re.searchнатомість.
LondonRob

@LondonRob, ймовірно, тому, що ifперевірки на відповідність не проводяться None.
Денніс

Існує велика потреба у компіляції, щоб переконатись у відсутності помилок у регулярних виразах, таких як помилки діапазону символів
Suh Fangmbeng

36

Будь ласка, спробуйте наступне:

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
Це єдиний випадок, який повертає збіг, необхідний для отримання груп. Найкраща відповідь на мій погляд.
Рік Сміт

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

регулярні вирази полегшують це ...

[A-Z] відповідатиме точно одному символу між A і Z

\d+ відповідатиме одній або більше цифр

() групувати речі (а також повертати речі ... але поки тільки подумайте про їх групування)

+ вибирає 1 або більше


6
  
import re

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


Я вважаю, що це повинно працювати з великої літери, а також з цифрою .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.