前提・実現したいこと
文字列から英単語のみのリストを生成したい
例
Subject: Re: WINBENCH 3.11 help
→['Subject', 'Re', 'WINBENCH', 'help']
発生している問題・エラーメッセージ
実行した結果,以下のようなa,A,z,Zのみからなるリストが出力されました.正規表現に問題があるものと思われるのですが,原因が分かりません.
該当のソースコード
読み込まれた文字列はlinesに入っているものとします.
for line in lines: # 読み込まれたテキストデータを行単位で処理
new_string = line.strip() # line 前後の余分な文字を除去
# [^a‐z A‐Z\n]は a‐z でも A‐Z でもない任意の文字
new_string = re.sub('[^a‐zA‐Z\n]', ' ',new_string)
new_string = re.sub('\.', ' ', new_string) # ピリオドを半角スペースに
new_string = re.sub('[0‐9]', ' ', new_string) # 数字を半角スペースに
words = new_string.split() # スペースで split し、単語リストを得る
print(words)
試したこと
new_string = re.sub('[^a‐zA‐Z\n]', ' ',new_string)をいったん消去して実行したところ,以下のように余分な文字が含まれますがちゃんとした単語が表示されました.おそらく問題点は正規表現の書き方にあると考えられます
補足情報(FW/ツールのバージョンなど)
Python3.8.6を使用しています.ターミナルはコマンドプロントです.
-
クリップを取り消します
-
質問の評価を上げたことを取り消します
-
質問の評価を下げたことを取り消します
+1
0
こんにちは
ご質問にあるコードで意図した結果にならない原因は、
new_string = re.sub('[^a‐zA‐Z\n]', ' ',new_string)
の正規表現 a‐z
と A‐Z
で使われているハイフン ‐
が、通常のハイフン、すなわちASCIIコード2Dのハイフン-
ではなく、 Unicode U+2010 のハイフンになっていることです。これらを通常の(2Dの)ハイフンに修正してみるといかがでしょうか?
- 参考: ハイフンに似てる文字の文字コード ryounagaokaさん@Qiita
追記
見た目上ほとんど見分けがつきませんが、下記のような修正になります。
- new_string = re.sub('[^a‐zA‐Z\n]', ' ',new_string)
+ new_string = re.sub('[^a-zA-Z\n]', ' ',new_string) # 通常のハイフンに修正
以下は、修正前の行をコメントアウトして、上記の、通常のハイフンに修正した行に置き換えたサンプルです。
- 動作確認用 Repl.it: https://repl.it/@jun68ykt/Q297047
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.88%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる