質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.88%

[Python]文字列から英単語のみのリストを生成したい (正規表現について)

受付中

回答 2

投稿 編集

  • 評価 0
  • クリップ 0
  • VIEW 58

-_sora.

score 6

前提・実現したいこと

文字列から英単語のみのリストを生成したい


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を使用しています.ターミナルはコマンドプロントです.

  • クリップを取り消します

  • 質問の評価を上げたことを取り消します

  • 質問の評価を下げたことを取り消します

回答 2

+1

これでいいのでは?

words = re.split(r'[^a-zA-Z]+', new_string)

投稿

KojiDoi

R総合1位

score 10009

0

こんにちは

ご質問にあるコードで意図した結果にならない原因は、

new_string = re.sub('[^a‐zA‐Z\n]', ' ',new_string)

の正規表現 a‐z と A‐Z で使われているハイフン  が、通常のハイフン、すなわちASCIIコード2Dのハイフン-ではなく、 Unicode U+2010 のハイフンになっていることです。これらを通常の(2Dの)ハイフンに修正してみるといかがでしょうか?

追記

見た目上ほとんど見分けがつきませんが、下記のような修正になります。

- new_string = re.sub('[^a‐zA‐Z\n]', ' ',new_string)
+ new_string = re.sub('[^a-zA-Z\n]', ' ',new_string)  # 通常のハイフンに修正

以下は、修正前の行をコメントアウトして、上記の、通常のハイフンに修正した行に置き換えたサンプルです。

投稿

編集

jun68ykt

score 8787

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

  • ただいまの回答率 88.88%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る