2

私はPythonが初めてなので、これは非常に簡単に思えるかもしれません。# 、数字をすべて削除しようとしています。同じ文字が 2 回以上繰り返される場合は、2 文字だけに変更する必要があります。これは完全に機能しますが、ØÆÅ では機能しません。

ØÆÅ 文字でこれを行う方法はありますか?

#!/usr/bin/python 
# -*- coding: utf-8 -*-

import math, re, sys, os, codecs
reload(sys)
sys.setdefaultencoding('utf-8')
text = "ån9d ånd ååååånd d9d flllllløde... :)asd "

# Remove anything other than digits
text = re.sub(r'#', "", text)
text = re.sub(r"\d", "", text)
text = re.sub(r'(\w)\1+', r'\1\1', text)
print "Phone Num : "+ text

私が今得た結果は次のとおりです。

Phone Num : ånd ånd ååååånd dd flløde... :)asd 

私が欲しいのは:

Phone Num : ånd ånd åånd dd flløde... :)asd 
4

2 に答える 2

5

バイト文字列ではなく、Unicode 値を使用する必要があります。UTF-8 エンコードå2バイトであり、デフォルトの非 Unicode 認識モードで動作している場合、正規表現マッチングは ASCII 文字、数字、およびアンダースコア\w のみに一致します。

モジュールのreドキュメントから\w

LOCALEおよびフラグが指定されていない場合、UNICODE任意の英数字とアンダースコアに一致します。これは set と同等[a-zA-Z0-9_]です。を使用すると、セットに加えて、現在のロケールで英数字として定義されている文字にLOCALE一致します。[0-9_]が設定されている場合、これは文字に加えて、Unicode 文字プロパティ データベースで英数字として分類されているものUNICODEと一致します。[0-9_]

残念ながら、Unicode 値を適切に使用するように切り替えても (Unicodeu''リテラルを使用するか、ソース データを Unicode 値にデコードすることによって)、Unicode 正規表現 ( re.sub(ur'...')) を使用し、フラグを使用してUnicode 英数字に一致re.UNICODEするように切り替えても、PythonモジュールにはUnicode マッチングの制限付きサポート:\wre

>>> print re.sub(ur'(\w)\1+', r'\1\1', text, re.UNICODE)
ånd ånd ååååånd dd flløde... :)asd 

åは英数字として認識されていないため:

>>> print re.sub(ur'\w', '', text, re.UNICODE)
å å ååååå  ø... :) 

解決策は、適切な完全な Unicode サポートを追加するライブラリのバージョンである外部regexライブラリを使用することです。re

>>> import regex
>>> print regex.sub(ur'(\w)\1+', r'\1\1', text, re.UNICODE)
ånd ånd åånd dd flløde... :)asd 

そのモジュールは、Unicode 値でより多くの英数字を認識するだけではありません。詳細については、リンクされたパッケージ ページを参照してください。

于 2013-05-15T09:01:47.420 に答える
0

変化する:

text = u"ån9d ånd åååååååånd d9d flllllløde... :)asd "

text = re.sub(r'(\w)\1+', r'\1\1', text)

完全なソリューション

import math, re, sys, os, codecs
reload(sys)
sys.setdefaultencoding('utf-8')
text = u"ån9d ånd åååååååånd d9d flllllløde... :)asd "

# Remove anything other than digits
text = re.sub(r'#', "", text)
text = re.sub(r"\d", "", text)
text = re.sub(r'(\w)\1+', r'\1\1', text)
text = re.sub(r'(\W)\1+', r'\1\1', text)
print "1: "+ text

印刷:

1: ånd ånd åånd dd flløde.. :)asd 
于 2013-05-15T09:14:16.203 に答える