5 に答える
unidecodeパッケージの上にビルドできます。
最初にすべてのユニコードを結合された形式に正規化し、次にユニコードがそれをどのように変換するかを確認しようとしているため、これはかなり遅いです。ラテン文字に一致する場合、実際には元の NFC 文字を使用します。そうでない場合は、デガーブリング unidecode が示唆するものは何でも生成します。これにより、強調された文字だけが残りますが、他のすべてが変換されます。
import unidecode
import unicodedata
import re
def char_filter(string):
latin = re.compile('[a-zA-Z]+')
for char in unicodedata.normalize('NFC', string):
decoded = unidecode.unidecode(char)
if latin.match(decoded):
yield char
else:
yield decoded
def clean_string(string):
return "".join(char_filter(string))
print(clean_string(u"vis-à-vis “Beyoncé”’s naïve papier–mâché résumé"))
# prints vis-à-vis "Beyoncé"'s naïve papier-mâché résumé
str.translate() メソッド ( http://docs.python.org/library/stdtypes.html#str.translate ) を使用できます。ただし、Unicode に関連するドキュメントを読んでください。変換テーブルには別の形式があります。Unicode の序数 --> Unicode 文字列 (通常は char) または None です。
ええと、しかしそれには口述が必要です。とにかく代替品をキャプチャする必要があります。テーブルや配列なしでそれをどのように行いたいですか? 単一の文字に str.replace() を使用できますが、これは非効率的です。
このツールは、マークダウンの句読点を正規化します: http://johnmacfarlane.net/pandoc/README.html
-S, --smart ストレート クォーテーションをカーリー クォーテーションに、--- EM ダッシュに、--- エン ダッシュに、そして ... を省略記号に変換して、タイポグラフィ的に正しい出力を生成します。「Mr.」などの特定の略語の後に、改行なしのスペースが挿入されます。(注: このオプションは、入力形式がマークダウンまたはテキスタイルの場合にのみ重要です。入力形式がテキスタイルの場合、または出力形式がラテックスまたはコンテキストの場合、自動的に選択されます。)
Haskellなので、インターフェースを理解する必要があります。