2016-07-22 76 views
1

提取值在Python中我可以做到以下幾點:使用字符串方法格式()從字符串

who = "tim" 
what = "cake" 
print "{0} likes {1}".format(who, what) 

產生「蒂姆喜歡蛋糕」。

但是,由於我需要使用正則表達式,反操作並不那麼簡單。我的意思是,解析一串已知結構並提取我知道它包含的部分,並將它們存儲到我的變量中。 這種提取我的執行:

import re 

expression = "([a-z]*) likes ([a-z]*)" 
input_line = "tim likes cake" 

who, what = re.search(expression, inputline).groups() 

這對參數的少量不夠整齊,但相比於我的「理想逆」的理念,以格式()這對我來說兩個主要缺點:

  • 提取的參數始終爲字符串,需要將它們轉換爲帶有額外行的浮點數。格式在內部處理所需的轉換,從任何值到字符串。
  • 我需要爲輸入和輸出定義不同的模板,因爲正規表達式格式爲「([az] *)likes([az] *)」的輸入模板不能重複用於數據的「導出」 ,格式化功能。

所以,我的問題是,做這樣的函數存在,因爲我們把它們打印字符串,隨後會自動解析字符串並獲得價值相同的方式幾乎相同的語法像
「{ 0}喜歡{1}」。提取物(誰,什麼,input_line =‘蒂姆喜歡蛋糕’)

我知道我可以創建我的自定義‘提取’功能,表現爲期望的,但我不希望如果已經有一個可用,就創建它。

+0

那麼...自然語言處理? –

+0

我認爲這簡單得多,因爲給出了模板語句並指定了要提取的信息。一種選擇是在空間中分割,並提取模板中用轉義字符標記的部分。但是,再次,我正在尋找現有的選擇,而不是自己做。 – rmhleo

回答

1
who = "tim" 
what = "cake" 
print "{0} likes {1}".format(who, what) 

這是可行的,因爲你確切知道字符串中的誰和什麼。如果是這樣的話,你不需要正則表達式。字符串是字符的名單:)

def extract_who_what_from_string(string): 
    words = string.split(" ") 
    who = words[0] 
    what = words[-1] 
    return who, what 

什麼比這更復雜的是,其實,自然語言處理和會很出我的範圍。

1

這是一個想法。

import re 

template ="{0} likes {1}" 
str_re = r"\w+" 
re.search(template.format(str_re, str_re), ...) 

雖然,看起來凌亂

1

似乎有不被超越分裂字符串和鑄造部件或使用re內置的解決方案。

這是一個有點古怪,因爲格式可用於輸入指定類型:"{0:03d}_{1:f}".format(12, 1)'012_3.000000',所以我不知道爲什麼沒有"012_3.000000".extract("{0:03d}_{1:f}", [a, b]),但..也許只有人由C來希望這樣的事情。

在任何情況下,您可能會發現parse module有用,如this建議的答案。