2012-04-03 4 views
1

にLOCALEとUNICODEフラグで正規表現を使用して。テストは、私はPythonでテストスクリプトを書きたいのPython

  1. に、私は空白文字の異なるセットを持っているASCII以外のロケールの文字列を与えていると空白'\ s'にre.LOCALEフラグを付けて出力を確認してください。
  2. 私もその補完をしたいと思います。 \Sにして、そのLOCALEに返される空白以外のものを参照してください。

これで私はどのように達成できましたか? ASCIIからの出力の明確な違いを見るにはどのロケールを選択すべきですか。

# -*- Proper encoding -*- 
import re 
pat = re.compile('\s*', re.LOCALE) 
string = "string" # Proper Replacement String? 
result = pat.match(string) 
print result.group(0) 

私はUbuntuを使用しており、私の現在のロケールは私のシェルのものです。 (それが問題にした場合)

$locale 
LANG=en_SG.UTF-8 
LANGUAGE=en_SG:en 
LC_CTYPE="en_SG.UTF-8" 
LC_NUMERIC="en_SG.UTF-8" 
LC_TIME="en_SG.UTF-8" 
LC_COLLATE="en_SG.UTF-8" 
LC_MONETARY="en_SG.UTF-8" 
LC_MESSAGES="en_SG.UTF-8" 
LC_PAPER="en_SG.UTF-8" 
LC_NAME="en_SG.UTF-8" 
LC_ADDRESS="en_SG.UTF-8" 
LC_TELEPHONE="en_SG.UTF-8" 
LC_MEASUREMENT="en_SG.UTF-8" 
LC_IDENTIFICATION="en_SG.UTF-8" 
LC_ALL= 

はところで、私は、UNICODEまたはロケールを認識し、入力/出力の少ない経験を持っています。私が知っている限り、ターミナルにコードポイントを使ってユニコード文字を入力することができます。

+0

可能な入力とは何か、その入力の目的とする出力は何ですか? – apple16

+0

入力はロケール文字を含む文字列になり、出力は正規表現との適切な一致になります。 –

答えて

1

ソースコードを掘り下げて自分の質問に答える。

Pythonのソースコードで

_sre.c

LOCALE空間の定義はこれです -

#define SRE_LOC_IS_SPACE(ch) (!((ch) & ~255) ? isspace((ch)) : 0) 

そしてNON_SPACEカテゴリの定義は、スペースの否定です。それでおしまい。

ここで、その定義が与えられると、255より高い文字値が確認されますが、チェックは全く行われません。 LOCALEフラグが設定されていると、単純なascii isspaceが考慮されますか?そして実際には、re.LOCALEフラグは空白文字または空白以外の文字のマッチングに特別な効果はありません。

ユニコードの場合、ロジックはunicodeobject.cで扱われています。それはASCIIの空白のスーパーセットであることがわかります。すべてのASCII空白文字もUnicode空白文字です。

これを考えると、Pythonでプログラムを書くことは不可能です。そこでは、ASCII空白文字を除いた 'ロケールまたはユニコードの排他的空白文字'をテストできます。

関連する問題