2011-03-12 32 views
1

是否可以定義特定語言字符將被視爲單詞。 也就是說再次不接受,O爲單詞字符,如果我搜索它們以下方式python re codecsäö,芬蘭語,定義爲單詞

Ft=codecs.open('c:\\Python27\\Scripts\\finnish2\\textfields.txt','r','utf–8') 
word=Ft.readlines() 
word=smart_str(word, encoding='utf-8', strings_only=False, errors='replace') 
word=re.sub('[^äÄöÖåÅA-Za-z0-9]',"""\[^A-Za-z0-9]*""", word) ; print 'word= ', word #works in skipping ö,ä,å characters 

我想,這些字符將被納入到[A-ZA-Z]。 如何定義這個?

回答

2

首先,您似乎對re.sub的參數有些困惑。

第一個參數是模式。你有'[^ääöÖåÅA-Za-z0-9]',它匹配不在芬蘭字母表中的每個字符和一個數字。

第二個參數是替換。您有「」「[^ A-Za-z0-9] *」「」...因此,每個非芬蘭文字數字字符將被替換爲文字字符串[^A-Za-z0-9]*。假設這不是你想要的是合理的。

  1. 什麼你想幹什麼?

  2. 你需要解釋你的第三行;在你的第2行之後,word將會是一個unicode對象的列表,這是一件好事。但encoding=errors=表明未知(對我們)smart_str()正在將您可愛的Unicode轉換回UTF-8。處理UTF-8字節而不是Unicode字符的數據是EVIL,除非你知道你在做什麼。

  3. 你在源文件的頂部有什麼編碼指令?

  4. 建議:將您的數據轉換爲unicode。在unicode上工作。你所有的字符串常量應該有u前綴;如果你認爲你的打字手指有太多的磨損,至少要把它放在非ASCII常量上,例如u'[^äÄöÖåÅA-Za-z0-9]'。完成所有處理後,使用適當的編碼對結果進行編碼以便顯示或存儲。

  5. 當與re一起工作時,請考慮\w,它將匹配任何字母數字(也可以是下劃線),而不是列出一種語言中的字母。請使用re.UNICODE標誌; docs here

+0

第2行後的'word'將是一個** **名單Unicode字符串。 – jfs 2011-03-12 10:20:32

+0

@ J.F。塞巴斯蒂安:很好。 – 2011-03-12 19:26:46

0

像這樣的事情可能做的伎倆:

pattern = re.compile("(?u)pattern") 

pattern = re.compile("pattern", re.UNICODE) 
4

[A-Za-z0-9]將只匹配在這裏列出的字符,但docs還提到其他一些特殊結構,如:

  • \w它代表字母數字字符(即[a-zA-Z0-9_]加上被宣佈爲字母數字的所有Unicode字符
  • \W它代表所有的尼姑字母數字字符[^a-zA-Z0-9_]加上unicode的
  • \d它代表數字
  • \b它匹配字邊界(包括來自Unicode表的所有規則)

所以,你會去(一)使用這個構造,而不是(這是較短的,也許更容易閱讀),和(b )告訴你要通過設置UNICODE標誌像「本地化」與當前的區域設置這些字符串重:

re_word = re.compile(r'\w+', re.U) 
+0

感謝您改進我的文章Donal的格式:) – tux21b 2011-03-12 09:44:42

+1

're.UNICODE'是語言環境無關的,使用're.LOCALE'取決於當前語言環境。 – jfs 2011-03-12 11:15:12