2015-01-13 43 views
0

輸入文本:蟒應用re.sub具有可變

Ell és la víctima que expia els nostres pecats, i no tan sols els nostres, sinó els del món sencer. 

預期輸出:

Ell és la víctima que expia els nostres pecats, i no tan sols els nostres, sinó els del món sencer. 

已知的事實: unichr(233)= E

爲現在我有

re.sub('&#([^;]*);', r'unichr(int(\1))', inputtext, flags=re.UNICODE) 

當然是不工作,不知道如何通過功能\1

有什麼想法?

回答

4

幸運的是,re.sub接受一個函數作爲參數,以及。該功能將接收到一個"MatchObject" - 從那裏,您可以通過match.group(1), match.group(2)等獲得匹配的組等。函數的返回值將是用於替換輸入文本中的匹配組的字符串。

def fn(match): 
    return unichr(int(match.group(1))) 

re.sub('&#([^;]*);', fn, inputtext, flags=re.UNICODE) 

如果你真的想,你可以內聯這一點,並使用lambda - 但我認爲拉姆達使得它更難在這種情況下讀取。


順便說一句,這取決於你的Python版本,也有對未逃逸HTML更好的方法(因爲它也將處理的特殊轉義序列像'&'

Python2.x

>>> import HTMLParser 
>>> s = 'Ell és la víctima que expia els nostres pecats, i no tan sols els nostres, sinó els del món sencer.' 
>>> print HTMLParser.HTMLParser().unescape(s) 
Ell és la víctima que expia els nostres pecats, i no tan sols els nostres, sinó els del món sencer. 

Python3.x

>>> import html 
>>> html.unescape(s) 

reference

特別是如果你給fn一個更明智的名稱;-)

+0

將檢查@mgilson,TNX快速響應 – josifoski

+0

耶的'高清',boo for'lambda'! - ) –

+0

@josifoski - 我意識到它看起來像是在格式化HTML字符串。如果是這樣,有一個更好的方法 - 這不涉及你的部分正則表達式:-)。查看我的更新。 – mgilson

5

使用lambda function

re.sub('&#([^;]*);', lambda match: unichr(int(match.group(1))), t, flags=re.UNICODE) 
+0

這是非常迅速的@rawing,讓我查 – josifoski