У меня проблема со следующей задачей. У меня есть строка:
ABCD[A] or A7D3[A,B,C]
0-9
или A-Z
.[
.A-Z
, за которым следует ,
, если букв больше одной.
например A
, E,F
, A,B,C,D,F
Я не знаю, есть ли ограничение на количество символов в средней части, поэтому я должен предположить, что оно равно 26 (A-Z).]
.Мне нужно убедиться, что структура строки такая, как указано выше.
ABCD[A,B]
BD1F[E,G,A,R]
S4P5[C]
Я пробовал с регулярным выражением (в питоне)
r = re.match('^[0-9A-Z]{4}[[A-Z,]+$',text)
Текст является примером строки, однако он не работает. Истина / ложь или 0 или 1 в качестве результата будут в порядке
Любые идеи, как это можно сделать? То, что я видел в Google до сих пор, регулярное выражение будет работать, однако я недостаточно разбираюсь в этом, чтобы решить это самостоятельно.
Вы можете использовать '[0-9A-Z]{4}\[[A-Z](?:,[A-Z]){,25}\]':
import re
for s in ['ABCD[A,B]', 'BD1F[E,G,A,R]', 'S4P5[C]']:
print(re.fullmatch(r'[0-9A-Z]{4}\[[A-Z](?:,[A-Z]){,25}\]', s))
Обратите внимание, что (?:,[A-Z]){,25} ограничивает количество букв в квадратных скобках, но не гарантирует, что они не повторяются.
Выход:
<re.Match object; span=(0, 9), match='ABCD[A,B]'>
<re.Match object; span=(0, 13), match='BD1F[E,G,A,R]'>
<re.Match object; span=(0, 7), match='S4P5[C]'>
Демонстрация регулярных выражений
Можешь попробовать:
import re
lst = ["ABCD[A,B]", "BD1F[E,G,A,R]", "S4P5[C]", "S4P5[CD]"]
pattern = r"^[A-Z0-9]{4}\[[A-Z](?:,[A-Z])*]$"
for string in lst:
m = re.match(pattern, string)
print(bool(m), m)
Выход:
True <re.Match object; span=(0, 9), match='ABCD[A,B]'>
True <re.Match object; span=(0, 13), match='BD1F[E,G,A,R]'>
True <re.Match object; span=(0, 7), match='S4P5[C]'>
False None
Объяснение:
^: начало строки. [A-Z0-9]{4} за получение первых 4 символов. \[ за выход из скобки. [A-Z] первый символ внутри скобки обязателен. (?:,[A-Z])* остальное по желанию. ]$: конец строки.
Примечание-1: вы можете ограничить количество внутренних символов до 25, изменив * на {,25}.
Примечание-2: я не избежал последней скобки, но это не повредит, если хотите (может быть, и лучше).
@mozway Ой, да. собираюсь исправить это сейчас
@mozway В общем, получилось как у тебя :)
Способов не сотни ;) (я написал "сотни", потому что уверен, что с "десятками" кто-то попытался бы их найти)
Это будет неправильно соответствовать S4P5[CD]