teratail header banner
teratail header banner
質問するログイン新規登録
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

1408閲覧

Pythonで文字列に日本語が含まれているかを調べるには

taro373

総合スコア189

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2022/07/19 08:23

編集2022/07/19 08:32

0

0

re.search を使って文字列中に、日本語などが含まれているかを調べようとしています。

検索する文字の指定として「'あ'」や「'[あ-ん]'」であれば考えている通りに動作しました。  
下記コードの(1)〜(4)の部分です。

python

1#!/usr/bin/env python3 2# -*- coding:utf-8 -*- 3import re 4#(1) 5str = 'abあc' 6check = re.search('あ', str) 7print(str,'\t',check) 8#(2) 9str = 'abc' 10check = re.search('あ', str) 11print(str,'\t',check) 12#(3) 13str = 'abあc' 14check = re.search('[あ-ん]', str) 15print(str,'\t',check) 16#(4) 17str = 'abc' 18check = re.search('[あ-ん]', str) 19print(str,'\t',check) 20 21#(5) 22str = 'abc' 23check = re.search('[\xe38180-\xe9beaf]', str) 24print(str,'\t',check) 25#(6) 26str = 'abあc' 27check = re.search('[\xe38180-\xe9beaf]', str) 28print(str,'\t',check)

記号も含めたい部分があるので、上記(5)(6)のように、文字コードで指定しました。
「\xe38180-\xe9beaf」と範囲指定しました。
すると、「'abあc'」にも「'abc'」にも「\xe38180-\xe9beaf」が含まれているとなってしまいました。

「'abあc'」も「'abc'」に対しても、「match='a'」となったのは、どのように考えればいいのでしょうか。
文字コードで検索する文字を指定するにはどのように指定すれば良いのでしょうか。

python

1~ $ python3 test.py 2abあc <_sre.SRE_Match object; span=(2, 3), match='あ'> (1) 3abc None (2) 4abあc <_sre.SRE_Match object; span=(2, 3), match='あ'> (3) 5abc None (4) 6abc <_sre.SRE_Match object; span=(0, 1), match='a'> (5) 7abあc <_sre.SRE_Match object; span=(0, 1), match='a'> (6)

文字コードで指定する部分を下記のように指定すると

python

1str = 'abあc' 2check = re.search('[\xe38182]', str) 3print(str,'\t',check)

結果が「None」となりました。“あ”は「e38182」だから、このように指定したのですが、考えている通りに動作しませんでした。

abあc None

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro373

2022/07/19 09:08

回答ありがとうございます 「'[\xe38180-\xe9beaf]'」の部分を下記のように変更しました。 結果は変わりませんでした。 > 4ケタ指定の\u を とのことですが、4桁ではまだ足りないかと思うのですが... str = 'abc' check = re.search('[\ue38180-\ue9beaf]', str) print(str,'\t',check) 「4ケタ指定の\uを使ってください。」とはこの書き方ではないのでしょうか であれば、と \xを2文字ごとにつけると str = 'abc' check = re.search('[\xe3\x81\x80-\xe9\xbe\xaf]', str) print(str,'\t',check) str = 'abあc' check = re.search('[\xe3\x81\x80-\xe9\xbe\xaf]', str) print(str,'\t',check) こんどは、ずべてNoneになってしまいました。
melian

2022/07/19 09:22

「あ」は Unicode では U+3042, 「ん」は U+3093 になります。なので、 check = re.search(r'[\u3042-\u3093]', str) としてみて下さい。
taro373

2022/07/20 02:58

ありがとうございました 条件を「check = re.search(r'[\u3042-\u3093]', str)」としたところ、下記の結果になりました abc None abあc <_sre.SRE_Match object; span=(2, 3), match='あ'> これで解決はしましたが、 print('あ'.encode('utf-8'))   とすると   V V V b'\xe3\x81\x82'       となります また、echoコマンドでも“あ”は“e38182”なので ~ $ echo 'あい'|xxd 00000000: e381 82e3 8184 0a ....... 「U+3042」ではなくutf-8の「e38182」で指定したいのですが、 本質問の「re.search を使って文字列中に、日本語などが含まれているか」とは 別件になると思うので、もう少し調べてから改めて、質問させていただきます。
guest

回答1

0

ベストアンサー

Pythonでは\xによる文字コード指定は16進数2ケタなので、それ以降の数字や文字はそのままマッチ条件として適用されてしまいます。
今回の場合、\xe9beafの文字コード指定は\xe9だけ有効で後のbeafはそのままアルファベットとして集合条件に含まれてしまい、
その中にaがあるのでaにマッチしています。

4ケタ指定の\uを使ってください。

投稿2022/07/19 08:54

RiaFeed

総合スコア2703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro373

2022/07/20 02:59

re.search(r'[\u3042-\u3093]', str) としたことで、コードの範囲での条件指定ができました ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問