5

Проверка, соответствует ли строка шаблону

16

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

Шаблон: заглавная буква, число(а), заглавная буква, число(а) и так далее.

Примеры:

Эти строки соответствуют шаблону:

A1B2
B10L1
C1N200J1

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

a1B2
^
A10B
   ^
AB400
^

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

5 ответ(ов)

7

Ваш код использует регулярные выражения для проверки строки string на соответствие заданному паттерну. Давайте разберем его по частям.

  1. Импортируем модуль re: Это стандартный модуль в Python для работы с регулярными выражениями.

    import re
    
  2. Компиляция паттерна: Здесь вы создаете компилированный объект регулярного выражения с помощью re.compile(). Ваш паттерн ^([A-Z][0-9]+)+$ имеет следующее значение:

    • ^ — начало строки,
    • ([A-Z][0-9]+) — группа, содержащая один заглавный латинский символ, за которым следует один или несколько цифр,
    • + — одна или более таких групп,
    • $ — конец строки.

    Таким образом, ваш паттерн проверяет, состоит ли строка из одной или нескольких сегментов, где каждый сегмент представляет собой заглавную букву, за которой следуют цифры.

    pattern = re.compile("^([A-Z][0-9]+)+$")
    
  3. Проверка строки: Метод match() проверяет, соответствует ли строка от начала до конца паттерну.

    pattern.match(string)
    

Если ваша строка соответствует данному паттерну, match() вернет объект соответствия (truthy value), в противном случае вернет None (falsy value).

Пример использования:

Вот пример использования вашего кода для проверки:

import re

pattern = re.compile("^([A-Z][0-9]+)+$")
string = "A1B2C3"  # Пример строки

if pattern.match(string):
    print("Строка соответствует паттерну.")
else:
    print("Строка не соответствует паттерну.")

Убедитесь, что ваша строка содержит хотя бы одну сегмент, состоящую из заглавной буквы и последующих цифр, иначе проверка не пройдет.

4

Вы можете использовать одну строку для проверки соответствия строки с помощью регулярного выражения, не компилируя паттерн отдельно:

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

Также вы можете оценить результат как bool, если это необходимо:

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

Попробуйте следующий код:

import re

name = ["A1B1", "djdd", "B2C4", "C2H2", "jdoi", "1A4V"]

# Соответствие именам.
for element in name:
     m = re.match(r"(^[A-Z]\d[A-Z]\d)", element)
     if m:
        print(m.groups())

Здесь мы используем регулярное выражение (^[A-Z]\d[A-Z]\d), чтобы найти элементы списка name, которые соответствуют шаблону из двух заглавных букв, разделенных цифрами. Обратите внимание, что метод re.match ищет совпадения только в начале строки. В результате выполнения этого кода будут выведены совпадающие элементы по указанному шаблону.

Регулярное выражение можно настроить под ваши нужды, если необходимо изменить критерии совпадений.

0

Внимание! (Возможно, вам стоит проверить, совпадает ли вся строка)

Функция re.match(...) не подойдет, если вам нужно проверить соответствие всей строки.

Например:

  • re.match("[a-z]+", "abcdef") ✅ даст совпадение.
  • Но! re.match("[a-z]+", "abcdef 12345") ✅ тоже даст совпадение, потому что начало строки совпадает (возможно, это вас не устраивает, когда вы проверяете, является ли вся строка валидной).

Решение

Используйте re.fullmatch(...). Она будет возвращать совпадение только в том случае, если вся строка соответствует шаблону:

if re.fullmatch("[a-z]+", my_string):
    print("Yes")
Пример
  • re.fullmatch("[a-z]+", "abcdef") ✅ Да
  • re.fullmatch("[a-z]+", "abcdef 12345") ❌ Нет

Однострочник: bool(re.fullmatch("[a-z]+", my_string))

0

Ваш код на Python использует регулярные выражения для проверки, соответствует ли входная строка определенному шаблону. Давайте рассмотрим его подробнее и переведем на русский язык:

import re
import sys

prog = re.compile('([A-Z]\d+)+')

while True:
    line = sys.stdin.readline()
    if not line: break

    if prog.match(line.strip()):  # стоит убрать символы переноса строки в конце
        print('matched')
    else:
        print('not matched')

Объяснение:

  1. Импорт библиотек: Вы импортируете библиотеки re для работы с регулярными выражениями и sys для работы со стандартным вводом.

  2. Компиляция регулярного выражения: Вы компилируете регулярное выражение ([A-Z]\d+)+, которое находит последовательности, начинающиеся с заглавной буквы (A-Z), за которой следуют одна или более цифр (0-9).

  3. Чтение ввода: В бесконечном цикле вы читаете строки из стандартного ввода с помощью sys.stdin.readline(). Если введена пустая строка (например, пользователь закончил ввод), цикл прерывается.

  4. Проверка строки: Используя метод match, вы проверяете, соответствует ли строка шаблону. Однако стоит отметить, что нужно использовать line.strip(), чтобы убрать лишние символы переноса строк, которые могут мешать.

  5. Вывод результата: Если строка соответствует шаблону, выводится 'matched', в противном случае — 'not matched'.

Этот код будет работать в интерактивном режиме, позволяя пользователю вводить строки и получать результаты проверки в реальном времени. Учтите, что в Python 3, необходимо использовать скобки для функций print.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь