Как построить шаблон регулярного выражения любой строки, если мы знаем тип каждого символа? - PullRequest
0 голосов
/ 19 июня 2019

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

N- Numericals A- Alphabets S- Special characters.

Мне дадут строковый формат вроде - "NNNSSAAANSAA" Мне нужно создать единый шаблон регулярных выражений для таких шаблонов.

усилия до сих пор:

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

Для которого я разбился на это решение: разбить на более мелкие жетоны и затем объединить.

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

На основе шаблонов регулярных выражений, найденных в ответе @ zb226, вы можете создать этот шаблон с помощью itertools.groupby:

from itertools import groupby

s = 'NNNSSAAANSAA'
pattern = ''.join({'N':r'\d', 'A':r'[a-zA-Z]', 'S':r'[^a-zA-Z\d]'}[v] +  '{%s}' % len(list(g)) for v, g in groupby(s)).replace('{1}', '')
print(pattern)

Отпечатки:

\d{3}[^a-zA-Z\d]{2}[a-zA-Z]{3}\d[^a-zA-Z\d][a-zA-Z]{2}
0 голосов
/ 19 июня 2019

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

  • Числа
  • Буквы
  • Специальные символы

ОбычныеВ движках выражений есть (сокращенные) классы символов для этого.Попробуйте:

  • [0-9] для чисел или сокращенную запись: \d
  • [A-Za-z] для алфавитов
  • [^A-Za-z0-9] для специальных символов,Обратите внимание на ^, что означает «не соответствует ни одному из следующих».

Теперь, когда вы знаете, как сопоставлять символы, нам нужен способ сказать, сколько из каждого символа мы используем.Принять, что делается с помощью квантификаторов :

  • * означает любое число
  • + означает любое число больше 0 (то есть "существует вхотя бы один раз ")
  • {n} означает ровно n раз
  • {n,m} означает от n до m раз

Таким образом, чтобы соответствоватьваш пример:

NNNSSAAANSAA

... вы наивно могли бы использовать ...

\d\d\d[^A-Za-z0-9][^A-Za-z0-9][A-Za-z][A-Za-z][A-Za-z]\d[^A-Za-z0-9][A-Za-z][A-Za-z]

... и сократить его с помощью квантификаторов, таких как:

\d{3}[^A-Za-z0-9]{2}[A-Za-z]{3}\d[^A-Za-z0-9][A-Za-z]{2}

CAVEAT: Обрабатывать всю сложность Unicode (например, подумать о римской цифре) немного сложнее, и поддержка таких вещей сильно варьируется между реализациями движка regex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...