EDIT: Zobacz także this answer za trochę więcej informacji o parse
i parmatter
.
Pakiet PyPI parse
Temu celowi służy również:
pip install parse
mogą być używane tak:
>>> import parse
>>> result=parse.parse('Version {0}.{1}.{2}\n', 'Version 1.15.6\n')
<Result ('1', '15', '6') {}>
>>> values=list(result)
>>> print(values)
['1', '15', '6']
Zauważ, że the docs say pakiet parse
nie dokładnie naśladować format specification mini-language domyślnie; używa również niektórych wskaźników typu określonych przez re
. Na szczególną uwagę zasługuje fakt, że s
domyślnie oznacza "spacje", a nie str
. To może być łatwo modyfikowane zgodnie ze specyfikacją formatu zmieniając typ domyślny s
do str
(używając extra_types
):
result = parse.parse(format_str, string, extra_types=dict(s=str))
Oto koncepcyjny pomysł na modyfikację string.Formatter
wbudowanej klasy przy użyciu parse
pakiet aby dodać unformat
możliwość, że użyłem sobie:
import parse
from string import Formatter
class Unformatter(Formatter):
'''A parsable formatter.'''
def unformat(self, format, string, extra_types=dict(s=str), evaluate_result=True):
return parse.parse(format, string, extra_types, evaluate_result)
unformat.__doc__ = parse.Parser.parse.__doc__
WAŻNE: nazwa metody parse
jest już używany przez klasę Formatter
, więc wybrałem unformat
zamiast tego, aby uniknąć konfliktów.
AKTUALIZACJA: Możesz go używać w ten sposób - bardzo podobnie do klasy string.Formatter
.
formatowanie (identyczny '{:d} {:d}'.format(1, 2)
)
>>> formatter = Unformatter()
>>> s = formatter.format('{:d} {:d}', 1, 2)
>>> s
'1 2'
Unformatting:
>>> result = formatter.unformat('{:d} {:d}', s)
>>> result
<Result (1, 2) {}>
>>> tuple(result)
(1, 2)
Jest to oczywiście bardzo ograniczone zastosowanie, jak pokazano powyżej. Jednakże przygotowałem pakiet pypi (parmatter - projekt pierwotnie na własny użytek, ale być może inni uznają to za użyteczne), który bada kilka pomysłów na to, jak wprowadzić ten pomysł do bardziej użytecznej pracy. Opakowanie w dużej mierze opiera się na wspomnianym wcześniej pakiecie parse
.
Widzę poniżej kilka odpowiedzi, które bezpośrednio dotyczą Twojego problemu. ale lepszym rozwiązaniem byłoby użycie wyrażeń regularnych imho. –
Wydaje się to przydatne dla [scanf] (http://code.activestate.com/recipes/502213-simple-scanf-implementation/) Styl C w stylu – Gaius