2013-11-26 32 views
1

我有一個正則表和替換函數的列表。正則表達式與Unicode和str

regex function 

replacement_patterns = [(ur'\\u20ac', ur' euros'),(ur'\xe2\x82\xac', r' euros'),(ur'\b[eE]?[uU]?[rR]\b', r' euros'), (ur'\b([0-9]+)[eE][uU]?[rR]?[oO]?[sS]?\b',ur' \1 euros')] 

class RegexpReplacer(object): 
def __init__(self, patterns=replacement_patterns): 
    self.patterns = [(re.compile(regex, re.UNICODE | re.IGNORECASE), repl) for (regex, repl) in patterns] 

def replace(self, text): 
    s = text 
    for (pattern, repl) in self.patterns: 
     (s, count) = re.subn(pattern, repl, s) 
    return s 

如果我寫的字符串作爲波紋管:

string='730\u20ac.\r\n\n ropa surf ... 5,10 muy buen estado..... 170 \u20ac\r\n\nPack 850\u20ac, reparaci\u00f3n. \r\n\n' 

replacer = RegexpReplacer() 

texto= replacer.replace(string) 

我得到完美的結果。

但是,如果我遍歷一個JSON文件時我剛裝調用的函數,它不工作(沒有錯誤,但沒有替換)

有什麼事發生的是,當我調用該函數在類型化該函數接收一個STR,當我從JSON迭代中調用它時,它會收到一個unicode。

我的問題是爲什麼我的正則表達式不在unicode上工作,它不應該是?

+0

我的猜測是JSON包含的東西比你想象的要多。也許'\\ u20ac'(字面反斜槓,字母u,數字2,0,字母a,c)而不是文字'\ u20ac'? – tripleee

+1

'你'\\ u20ac''這是錯的。你想要'你'\ u20ac''。你的unicode字符串中也不應該有utf-8編碼的數據。 – beerbajay

+0

@beerbajay很多謝謝!我想我現在知道了......如果我用你的'',我不需要第一個\告訴正則表達式它是一個普通的字符?但如果我用r'',我不需要? – user2950162

回答

0

也許你需要像這樣

import re 
regex = re.compile("^http://.+", re.UNICODE) 

如果你需要不止一個,你可以這樣做

regex = re.compile("^http://.+", re.UNICODE | re.IGNORECASE) 

獲取例如

>>> r = re.compile("^http://.+", re.UNICODE | re.IGNORECASE) 
>>> r.match('HTTP://ыыы') 
<_sre.SRE_Match object at 0x7f572455d648> 

是否正確結果?

>>> class RegexpReplacer(object): 
...  def __init__(self, patterns=replacement_patterns): 
...   self.patterns = [(re.compile(regex, re.UNICODE | re.IGNORECASE), repl) for (regex, repl) in patterns] 
...  def replace(self, text): 
...   s = text 
...   for (pattern, repl) in self.patterns: 
...    (s, count) = re.subn(pattern, repl, s) 
...   return s 
... 
>>> string='730\u20ac.\r\n\n ropa surf ... 5,10 muy buen estado..... 170 \u20ac\r\n\nPack 850\u20ac, reparaci\u00f3n. \r\n\n' 
>>> replacer = RegexpReplacer() 
>>> texto= replacer.replace(string) 
>>> texto 
u'730 euros.\r\n\n ropa surf ... 5,10 muy buen estado..... 170 euros\r\n\nPack 850 euros, reparaci\\u00f3n. \r\n\n' 
+0

謝謝!但沒有工作......只是試圖在上面的更新代碼,但沒有改變任何東西......這讓我瘋狂...... – user2950162

+0

嗯,檢查結果,它是否正確? – itdxer

+0

對我來說,它的作品...我得到這730歐元。 ropa surf ... 5,10 muy buen estado .....170歐元 包850歐元,reparaci \ u00f3n。 – user2950162

0

如果您想要Unicode替換模式,則還需要對Unicode字符串進行操作。 JSON也應該返回Unicode。

通過刪除\\並刪除UTF-8(不會在Unicode字符串中看到)來更改以下內容。你也IGNORE_CASE所以無需[eE]等:

replacement_patterns = [(ur'\u20ac', ur' euros'),(ur'\be?u?r\b', r' euros'), (ur'\b([0-9]+)eu?r?o?s?\b',ur' \1 euros')] 

進行以下Unicode字符串編譯(添加u):

string = u'730\u20ac.\r\n\n ropa surf ... 5,10 muy buen estado..... 170 \u20ac\r\n\nPack 850\u20ac, reparaci\u00f3n. \r\n\n' 

那麼就應該對Unicode的JSON操作爲好。