56384


[検索の際に全角のスペース記号がセパレータとして扱われていない](https://ja.meta.stackoverflow.com/q/3037/754)

メタの、上記のレポートをみていて、これは、一般的なシステムにおいてよくある問題な気がしました。というのも、日本人を対象にしたシステムであれば、スペースとして取り扱いたいものは、大体の場合において半角スペース(U+0020)と全角スペース(U+3000)ぐらいですが、これを、システムを
i18n 化して取り扱うときには、各言語ごとにスペースっぽいものを定義して、それらをまとめてスペースと同じ処理を適用することになると思いました。

であるならば、もうちょっと汎用的にこの問題を解決したく、そこで考えたのが、 Unicode の NFKC
正規化変換をおこなったのちに、結果が半角スペースになるものを、一括してスペースとして取り扱う、というものです。

# 質問

ある文字列 s があったときに、 nfkc
正規化で半角スペースになる文字列のみを、実際に半角スペースに置換したいです。これは、どうやったら実現できるでしょうか？


CC BY-SA 4.0
2019-07-04T07:22:25.610
56375
2019-07-04T09:27:28.963
754
question
python unicode
nfkc 正規化で半角スペースに変わる文字たちだけを半角スペースに変更したい


Unicode文字にはカテゴリが設定されており、U+0020もU+3000もSeparator, space
(Zs)となっています。NFKCよりもこちらを使う方が簡単ですし、対応しやすいと思います。Perlや.NET、ES2018の正規表現では`\p{Zs}`で表現できます。残念ながらPythonには含まれていなさそうです。

改行などを含んでもよければ、[`\s`](https://docs.python.org/ja/3/library/re.html#index-30)がU+3000を含みます。

> Unicode 空白文字 (これは `[ \t\n\r\f\v]`
> その他多くの文字、例えば多くの言語におけるタイポグラフィ規則で定義されたノーブレークスペースなどを含みます) にマッチします。 ASCII
> フラグが使われているなら、`[ \t\n\r\f\v]` のみにマッチします。


CC BY-SA 4.0
2019-07-04T09:27:28.963
56384
2019-07-04T09:27:28.963
4236
56375
answer