タイトルの内容を実現しようとした背景から書きます
背景
やりたかったこと
例として、『ゼロ幅スペース』(UTF-8 :「E2 80 8B」)などがファイル中に含まれているかチェックしたかった
“あ”のような通常の文字であれば、ソースコードに書けますが
『ゼロ幅スペース』の場合は書いてしまうと(たとえコメントを書いていても)
わかりにくいと思い、「この文字コードを指定している」と明示しようと
考えた次第です。
それに加えて、入力データ中でチェックしたい文字コードは『ゼロ幅スペース』だけではないと判断できたので、文字コードの範囲を指定して正規表現でチェックをしようと考えました。
なぜ文字コード(utf-8)で指定しようとしたか
想定していない文字コードが文字化けをしたときに、xddコマンドで調べると表示されるのはutf-8のコードだった。
文字化けした
-> xxdコマンドで原因となる文字コードを特定
-> utf-8で表示された文字コードをpythonでチェックしたい
ネックになった部分
・utf-8をPythonのコード中で記述する方法がわからなかった
『ゼロ幅スペース』はunikcodeであれば 「'\u200B'」と書けばいいことはわかった
・正規表現で文字コードを指定する方法がわからなかった
※ 上記2がわからなかったので、いわば「わからないことがわからない」状態で質問をしてしまい、ご迷惑をおかけしましたこと、この場をお借りしてお詫びします。
解決方法
・decode('utf-8')を使ってutf-8の文字コード指定 コードを指定して変数に文字を一旦入力
・上記の変数を正規表現で使うため、compileを使用
解決方法(Code)
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import re
import sys
searchstr = "今日の気温は25℃です"
# 正規表現パターンオブジェクトの生成(コンパイル)
str1 = b'\xe3\x81\x82'.decode('utf-8') # “あ”
str2 = b'\xe3\x82\x93'.decode('utf-8') # “ん”
print(str1)
pattern = re.compile(r'['+str1+'-'+str2+']')
print(pattern)
str1 = 'あ'
# matchメソッドで文字列を検索
print( pattern.search(searchstr) )
print()
# 正規表現パターンオブジェクトの生成(コンパイル)
str1 = b'\xe2\x84\x80'.decode('utf-8') # “℀”
str2 = b'\xe2\x84\x8F'.decode('utf-8') # “ℏ”
print(str1)
pattern = re.compile(r'['+str1+'-'+str2+']')
print(pattern)
str1 = 'あ'
# matchメソッドで文字列を検索
print( pattern.search(searchstr) )
[結果]
あ
re.compile('[あ-ん]')
<_sre.SRE_Match object; span=(2, 3), match='の'>
℀
re.compile('[℀-ℏ]')
<_sre.SRE_Match object; span=(8, 9), match='℃'>