Вы можете динамически построить регулярное выражение, используя шаблон.Затем сопоставьте его с любой входной строкой.
import re
template = "Hello my name is <name>, I'm <age>."
pattern = "^" + re.escape(template) + "$"
pattern = re.sub("<[^>]+>", "(?P\g<0>.*)", pattern)
regex = re.compile(pattern, re.DOTALL)
string = "Hello my name is John Doe, I'm 30 years old."
match = regex.match(string)
match.group(0)
#=> "Hello my name is John Doe, I'm 30 years old."
match.group("name")
#=> 'John Doe'
match.group("age")
#=> '30 years old'
match.groups()
#=> ('John Doe', '30 years old')
Единственное ограничение на шаблон заключается в том, что должны использоваться допустимые имена групп регулярных выражений.
Вы можете поднять это, просто не используя именованное регулярное выражениеgroups.
# replacing
pattern = re.sub("<[^>]+>", "(?P\g<0>.*)", pattern)
# with
pattern = re.sub("<[^>]+>", "(.*)", pattern)
Объедините это с перекрестными ссылками на заполнители из шаблона, и у вас будет больше опций именования.
placeholders = re.findall("<[^>]+>", template)
placeholders = list(map(lambda match: match[1:-1], placeholders))
dict(zip(placeholders, match.groups()))
#=> {'name': 'John Doe', 'age': '30 years old'}