Обратите внимание, что у меня нет никакого опыта работы с разбором и очень ограниченным опытом работы с регулярным выражением. Это было более сложной задачей для меня больше, чем для решения, но независимо от того, что это может быть полезно для вас.
Ваш синтаксис не так далеко от питона генератору, действительного генератора питона, который производит значения, которые будут выглядеть следующим образом:
def temp():
for _ in range(2):
yield 'a'
for _ in range(3):
yield 'b'
yield 'c'
Итак, есть только две замены вы должны сделать , то for n
в for _ in range(n)
:
def sub_for(match):
return "_ in range({})".format(match.group(0))
def my_code_to_generator(code):
# match a number that is preceded by "for " and right before a ":"
code = re.sub("(?<=for)\d+(?=:)",sub_for,code)
...
И изменяющиеся произвольные буквы a
в отчетность доходности yield 'a'
:
def sub_letter(match):
return "yield {!r}".format(match.group(0))
def my_code_to_generator(code):
code = re.sub("(?<=for)\d+(?=:)",sub_for,code)
#match a single character that has whitespace around it.
code = re.sub("(?<=\s)[A-Za-z](?=\s)", sub_letter, code)
....
Затем положить его в def
заявление и выполнение его в качестве кода Python будет производить итератор, который генерирует символы вы желаете:
import re
def sub_for(match):
return "_ in range({})".format(match.group(0))
def sub_letter(match):
return "yield {!r}".format(match.group(0))
def my_code_to_generator(code):
code = re.sub("(?<=for)\d+(?=:)",sub_for,code)
code = re.sub("(?<=\s)[A-Za-z](?=\s)", sub_letter, code)
code = "def temp():\n " + code.replace("\n","\n ")
namespace = {}
exec(code,namespace)
return namespace["temp"]()
text = """
for 2:
{
a
for 3:
{
b
c
}
}""".replace("{","").replace("}","") #no curly braces in python!
>>> list(my_code_to_generator(text))
['a', 'b', 'c', 'b', 'c', 'b', 'c', 'a', 'b', 'c', 'b', 'c', 'b', 'c']
>>> "".join(my_code_to_generator(text))
'abcbcbcabcbcbc'
Да я понимаю, что это очень непрактичное и неуклюжее решение, я не ожидаю, что это будет окончательный ответ, но пока кто-то не станет лучше, он может позволить вам получить некоторые результаты. :)
Нет причин ожидать, что решение ad hoc с менее мощными инструментами будет * проще *, чем использование высокоуровневых инструментов, предназначенных для вашей задачи. – user2357112
Но мне нужно интегрировать его в мой проект python, который работает с такими последовательностями. Как я могу сделать? Что мне нужно использовать? О каких инструментах говорят?)))) –
Получите [pyparsing] (http://pyparsing.wikispaces.com/) или какой-нибудь другой генератор парсера и напишите себе парсер. – user2357112