преобразовать строку в регулярное выражение - PullRequest
0 голосов
/ 12 октября 2019

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

из sting "1example4whatitry2do", я хочу найти шаблон, подобный: [0-9]{1}[a-z]{7}[0-9]{1}[a-z]{8}[0-9]{1}[a-z]{2}

Так что я могу использовать этот паттерн, чтобы найти другой пример sting 2eytmpxe8wsdtmdry1uo

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

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 12 октября 2019

Вы можете разобраться в этом:

  • пройтись по строкам символьно
    • , если символ является текстовым, добавить '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}

См.

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