Вы можете разобраться в этом:
- пройтись по строкам символьно
- , если символ является текстовым, добавить
't'
в список - если символ представляет собой число, добавьте
'd'
в список - , если символ является чем-то другим, добавьте себя в список
Используйте itertools.groupby
группировать последовательные одинаковые буквы в группы. Создайте шаблон из ключа группы и длины группы, используя некоторое строковое литеральное форматирование.
Код:
from itertools import groupby
from string import ascii_lowercase
lower_case = set(ascii_lowercase) # set for faster lookup
def find_regex(p):
cum = []
for c in p:
if c.isdigit():
cum.append("d")
elif c in lower_case:
cum.append("t")
else:
cum.append(c)
grp = groupby(cum)
return ''.join(f'\\{what}{{{how_many}}}'
if how_many>1 else f'\\{what}'
for what,how_many in ( (g[0],len(list(g[1]))) for g in grp))
pattern = "1example4...whatit.ry2do"
print(find_regex(pattern))
Вывод:
\d\t{7}\d\.{3}\t{6}\.\t{2}\d\t{2}
The троичный в форматировании удаляет ненужные {1}
из шаблона.
См .:
Если вы замените '\t'
на '[a-z]'
, то ваше регулярное выражение должно соответствовать. Вы также можете заменить проверку isdigit , используя вместо этого регулярное выражение r'\d'
или in set(string.digits)
.
pattern = "1example4...whatit.ry2do"
pat = find_regex(pattern).replace(r"\t","[a-z]")
print(pat) # \d[a-z]{7}\d\.{3}[a-z]{6}\.[a-z]{2}\d[a-z]{2}
См.