EDIT: También vea this answer para un poco más de información acerca parse
y parmatter
.
El paquete PyPI parse
sirve bien para este propósito:
pip install parse
Puede ser utilizado como esto:
>>> 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']
Tenga en cuenta que el paquete the docs sayparse
no hace exactamente emular el format specification mini-language por defecto; también usa algunos indicadores de tipo especificados por re
. De especial importancia es que s
significa "espacio en blanco" por defecto, en lugar de str
. Esto puede ser fácilmente modificado para ser compatible con la especificación de formato cambiando el tipo predeterminado para s
a str
(usando extra_types
):
result = parse.parse(format_str, string, extra_types=dict(s=str))
Aquí es una idea conceptual para una modificación de la string.Formatter
clase incorporada mediante el parse
paquete para agregar capacidad de unformat
que yo mismo he utilizado:
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__
IMPORTANTE: el nombre del método parse
ya está en uso por la clase Formatter
, así que he elegido unformat
en su lugar para evitar conflictos.
ACTUALIZACIÓN: Puede usarlo así: muy similar a la clase string.Formatter
.
Formateo (idéntico al '{: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)
Esto es por supuesto de uso muy limitado como se muestra arriba. Sin embargo, he puesto un paquete pypi (parmatter - un proyecto originalmente para mi propio uso, pero tal vez otros lo encuentren útil) que explora algunas ideas de cómo poner esta idea en un trabajo más útil. El paquete se basa en gran medida en el paquete parse
antes mencionado.
veo algunas de las respuestas a continuación que son directas para su problema. pero una mejor solución sería usar expresiones regulares en mi humilde opinión. –
Esto parece ser un buen uso para [scanf] (http://code.activestate.com/recipes/502213-simple-scanf-implementation/) C-style – Gaius