2014-09-04 2 views
2

ПроблемаЗамена "маркеры" в строке Python с альтернативными значениями

Представьте себе сценарий, который принимает строку:

http://whatever.org/[email protected]@&[email protected]@

... и список лексем:

['arg:Title=SampleTitle', 'arg:Note=SampleNote']

Что является самым Pythonic способом интерполирования этих токенов s в строке, например, что, используя приведенный выше пример, следующий производится:

http://whatever.org/?title=SampleTitle&note=SampleNote

Мои идеи

  1. Loop по списку и для каждой строки, она содержит, разделите имя токена и замените регулярное выражение на каждый экземпляр @TOKEN_NAME.

  2. Используйте какой-то механизм шаблонирования (аналогичный тому, который можно сделать с помощью Ruby's ERB.template).

Помочь?

Я довольно новичок в Python и хотел бы, чтобы эксперты взяли. Благодаря!

ответ

8

Для использования решения Pythonic, принять str.format спецификации format string syntax:

>>> template = "http://whatever.org/?title={Title}&note={Note}" 
>>> template.format(Title="SampleTitle", Note="SampleNote") 
'http://whatever.org/?title=SampleTitle&note=SampleNote' 

Вы также можете распаковать словарь именованных аргументов:

>>> template.format(**{"Title": "SampleTitle", "Note": "SampleNote"}) 
'http://whatever.org/?title=SampleTitle&note=SampleNote' 

Если вы застряли ваш формат ввода, вы можете легко переключиться на что-то более полезное с помощью regular expression:

>>> import re 
>>> s = "http://whatever.org/[email protected]@&[email protected]@" 
>>> re.sub(r"@(\w+?)@", r"{\1}", s) 
'http://whatever.org/?title={Title}&note={Note}' 

(см регулярок объяснение here)

и обработать маркеры в словарь, тоже:

>>> tokens = ['arg:Title=SampleTitle', 'arg:Note=SampleNote'] 
>>> dict(s[4:].split("=") for s in tokens) 
{'Note': 'SampleNote', 'Title': 'SampleTitle'} 
+0

Простой и прямой; Спасибо. Не могли бы вы объяснить, что '**' делает перед dict в вашем втором примере? – ABach

+0

@ABчас см., Например, http://stackoverflow.com/q/36901/3001761 – jonrsharpe

+0

Замечательно. Спасибо. – ABach

Смежные вопросы