2012-01-31 58 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