2012-01-31 32 views
3

Python中是否有任何方式来反转通过“%”运算符完成的格式化操作?从Python格式解析

formated = "%d ooo%s" % (12, "ps") 
#formated is now '12 ooops' 
(arg1, arg2) = theFunctionImSeeking("12 ooops", "%d ooo%s") 
#arg1 is 12 and arg2 is "ps" 

编辑正则表达式可以是一个解决方案,但他们都很难写,我怀疑他们要慢一些,因为他们能够处理更复杂的结构。我真的很喜欢sscanf的等价物。

+5

是:使用正则表达式。 – Marcin 2012-01-31 17:58:00

+1

可能重复的[sscanf在Python](http://stackoverflow.com/questions/2175080/sscanf-in-python) – 2012-01-31 17:59:39

+0

@MichaelMrozek谢谢,我忘了那个C函数的名称 – AsTeR 2012-01-31 18:01:51

回答

6

使用正则表达式(re模块):

>>> import re 
>>> match = re.search('(\d+) ooo(\w+)', '12 ooops') 
>>> match.group(1), match.group(2) 
('12', 'ps') 

正则表达式是尽可能接近你可以得到你想要的东西。没有办法使用相同的格式字符串('%d ooo%s')。

编辑:作为@Daenyth建议,你可以实现这种行为自己的函数:

import re 

def python_scanf(my_str, pattern): 
    D = ('%d',  '(\d+?)') 
    F = ('%f', '(\d+\.\d+?)') 
    S = ('%s',  '(.+?)') 
    re_pattern = pattern.replace(*D).replace(*F).replace(*S) 
    match = re.match(re_pattern, my_str) 
    if match: 
     return match.groups() 
    raise ValueError("String doesn't match pattern") 

用法:

>>> python_scanf("12 ooops", "%d ooo%s") 
('12', 'p') 
>>> python_scanf("12 ooops", "%d uuu%s") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 10, in python_scanf 
ValueError: String doesn't match pattern 

当然,python_scanf不会更复杂的工作如%.4f%r

+0

我宁愿使用相同的格式字符串。 – AsTeR 2012-01-31 18:02:17

+0

格式字符串不是正则表达式。 – 2012-01-31 18:07:00

+0

@AsTeR有没有可能的方式与*相同的格式字符串*。 – juliomalegria 2012-01-31 18:08:32