Проверьте, соответствует ли строка образцу


317

Как проверить, соответствует ли строка этому шаблону?

Прописная буква, число (я), заглавная буква, число (я) ...

Пример, они будут соответствовать:

A1B2
B10L1
C1N200J1

Это не будет ('^' указывает на проблему)

a1B2
^
A10B
   ^
AB400
^

3
не могли бы вы объяснить больше, почему это проблема?
Джон Ву

4
^([A-Z]\d+){1,}$как это?
прохожий

В вашем третьем примере проблема должна быть с, Bа не с A.
Бурхан Халид

возможно это ошибка опечатки в проблеме. и то Aи другое B, верно? A10bа aB400?
Джон Ву

@Burhan, проблема с A, потому что рядом с B есть числа, а у A нет
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.