4

私はこのコードを持っています

import chardet, re    

content = "Бланк свидетельства о допуске."
print content
print chardet.detect(content)
content = re.sub(u"(?i)[^-0-9a-zа-яё«»\&\;\/\<\>\.,\s\(\)\*:!\?]", "", content)
print content
print chardet.detect(content)

そして出力

Бланк свидетельства о допуске.
{'confidence': 0.99, 'encoding': 'utf-8'}
� �  .
{'confidence': 0.5, 'encoding': 'windows-1252'}

私は何を間違っていますか?後に uft-8 文字列を取得するにはどうすればよいre.sub()ですか? (Python 2.7、# coding: utf-8UTF-8 のファイル、IDE Pycharm)。

ありがとう。

4

2 に答える 2

7

これは(私が思うに)あなたが達成しようとしているものです(明確にするために正規表現を単純化しました):

#coding=utf8
import re    
content = u"Бланк XYZ свидетельства о ???допуске."
content = re.sub(u"(?iu)[^а-яё]", ".", content)
print content.encode('utf8') # Бланк.....свидетельства.о....допуске.

重要な点に注意してください。

  • 件名はユニコードです
  • 式はユニコードです
  • 式は unicode フラグ(?u)を使用して大文字と小文字の折り畳みを機能させます。

また、本格的な Unicode 作業には、優れたほぼ完全な Unicode サポートを提供するregexモジュールをお勧めします。検討:

# drop everything except Cyrillic and spaces 
import regex
content = regex.sub(u'[^\p{Cyrillic}\p{Zs}]', '', content) 

alters と friends のみが文書されていますが、私のテストでは大文字と小文字の折り畳みにも影響します ( ):re.UNICODE\wre.IGNORECASE

Python 2.7.2+ (default, Oct  4 2011, 20:06:09) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> src = u'Σσ Φφ Γγ'
>>> src
u'\u03a3\u03c3 \u03a6\u03c6 \u0393\u03b3'
>>> re.sub(ur'(?i)[α-ώ]', '-', src)
u'\u03a3- \u03a6- \u0393-'
>>> re.sub(ur'(?iu)[α-ώ]', '-', src)
u'-- -- --'

つまり、これは文書化されていない機能か、文書化の問題です。

于 2013-04-21T11:47:37.493 に答える