Python3 - генерирует строки, соответствующие нескольким регулярным выражениям, без их изменения - PullRequest
0 голосов
/ 04 декабря 2018

Я хотел бы сгенерировать строку, соответствующую моим регулярным выражениям, используя Python 3. Для этого я использую удобную библиотеку под названием rstr .

Мои регулярные выражения:

  • ^[abc]+.
  • [a-z]+

Моя задача:

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

Что я не могу сделать:

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

import re
import rstr

regex1 = re.compile(r'^[abc]+.')
regex2 = re.compile(r'[a-z]+')

for index in range(0, 1000):
  generated_string = rstr.xeger(regex1)
  if re.fullmatch(regex2, generated_string):
    break;
else:
  raise Exception('Regexes are probably incompatibile.')

print('String matching both regexes is: {}'.format(generated_string))

Есть ли обходной путь или какая-нибудь волшебная библиотека, которая может справиться с этим?Любые идеи приветствуются.

Вопросы, которые кажутся похожими, но ни в коем случае не полезны:

Аскер уже имеет строку, которую он просто хочет проверить по множеству регулярных выражений самым элегантным способом.В моем случае нам нужно сгенерировать строку умным способом, который бы соответствовал регулярным выражениям.

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

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

Вам нужно создать какое-то представление регулярного выражения (как это делает rstr через вызов sre_parse.py) изатем вызов некоторых SMT-решателей, удовлетворяющих обоим критериям.

Для Haskell есть https://github.com/audreyt/regex-genex, в котором для этого используется SMT-решатель Yices, но я сомневаюсь, что для Python есть что-то подобное.На вашем месте я бы откусил пулю и вызвал ее как внешнюю программу из вашей программы на Python.

0 голосов
/ 07 декабря 2018

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

Я использовал пакет Python от Google sre_yield , который допускает ограничение кодировки.Пакет также доступен на PyPi .Мой код:

import sre_yield
import string

sre_yield.AllStrings(r'^[abc]+.', charset=string.ascii_lowercase)[0]
# returns `aa`
0 голосов
/ 04 декабря 2018

Я не знаю, есть ли что-то, что может удовлетворить ваши нужды.Но я бы сделал это примерно так (как вы уже сделали):

  1. Создайте объект Regex с помощью функции re.compile ().
  2. Генерация строки на основе 1-горегулярное выражение.
  3. Передайте полученную строку во второй объект регулярного выражения, используя метод search ().
  4. Если это проходит ... Готово, строка прошла оба регулярных выражения.

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

И затем, если вам нужно сопоставить 8 регулярных выражений ... Просто сделайте:

call (regex1, regex2)
call (regex2, regex3)
call (regex4, regex5)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...