Преобразовать строку в несколько переменных с шаблоном - PullRequest
5 голосов
/ 07 февраля 2020

Я все еще учусь python, есть ли способ преобразовать строку python в несколько переменных с определенным шаблоном?

Например, шаблон и текст:

pattern = '{var1},{var2}::{var3}-:{var4}'
string_text = 'test1,test2::test3-:test4'

convert to:

var1, var2, var3, var4 = magic method convert string_text using pattern
print(var1)  # test1
print(var2)  # test2
print(var3)  # test3
print(var4)  # test4

Я знаю, что есть возможность выполнить такое действие с объектом datetime:

datetime.strptime('1992-12-22', "%Y-%m-%d")

Также я могу сделать это с помощью регулярных выражений (помощь в этом не требуется ;) но может быть в строковом объекте есть тот же метод, который я просто не знаю, как использовать?

Буду признателен за любую помощь!

1 Ответ

2 голосов
/ 07 февраля 2020

Вы можете использовать регулярное выражение для перевода вашего pattern в правильный шаблон регулярного выражения с именованными группами захвата, например, '(?P<var1>.*?),(?P<var2>.*?)::(?P<var3>.*?)-:(?P<var4>.*?)', а затем использовать это регулярное выражение, чтобы получить словарь, содержащий "переменные":

>>> import re
>>> pattern = '{var1},{var2}::{var3}-:{var4}'
>>> string_text = 'test1,test2::test3-:test4'
>>> p = re.sub("\{(.*?)\}", r"(?P<\1>.*?)", pattern)
>>> m = re.match("^" + p + "$", string_text)
>>> m.groupdict()
{'var1': 'test1', 'var2': 'test2', 'var3': 'test3', 'var4': 'test4'}

Обратите внимание, что ваш pattern уже содержит некоторые управляющие символы regex. Это, похоже, не является проблемой, но вам лучше сначала re.escape pattern, а затем выполнить re.sub на экранированном шаблоне: p = re.sub(r"\\{(.*?)\\}", r"(?P<\1>.*?)", re.escape(pattern))

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