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

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

新規登録して質問してみよう
ただいま回答率
85.35%
正規表現

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

1294閲覧

行末の空白文字を除いて文字列を抽出したい

shinjukuzame

総合スコア12

正規表現

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/11 22:58

正規表現を用いて行末の空白文字を除いて文字列を抽出したいです。

文字列として
『"Subject: 【件名】このような 件名 がある   』
のようなものがあると想定ください。
”ある”の後ろには全角スペースが2個、半角スペースが2個あります

このような文字列から
『【件名】このような 件名 がある』
だけ抽出したいです。

import re mailbody = "Subject: 【件名】このような 件名 がある   " match_case = re.findall(r'Subject:\s*【.*】(.*)\s*$', mailbody ) print(match_case[0])

としてみたのですが、
結果は

このような 件名 がある  

となり、行末のスペースを除くことが出来ません。

(.*) が貪欲にマッチして空白までマッチしており、
\sが0回としてマッチしたような感じなのでしょうか?

上記推測が正しいとして、目的とする文字列を得るにはどのような正規表現とすれば
よいのでしょうか?

有識者の方、ご教示いただけますでしょうか

以上、よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

(.*) が貪欲にマッチして空白までマッチしており、

「貪欲にマッチ」という言葉を知っているのなら、「控えめなマッチ」も知っていそうな物ですが。

Python

1match_case = re.findall(r'Subject:\s*【.*】(.*?)\s*$', mailbody )

ですね。

投稿2020/07/12 01:42

編集2020/07/12 02:21
otn

総合スコア85901

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

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

shinjukuzame

2020/07/12 02:21

ご回答ありがとうございます。 >「貪欲にマッチ」という言葉を知っているのなら はい、そうなんです。 「このような」の後の空白を意識して控えめなマッチを(試しもせずに)回避したのですが、 ``` match_case = re.findall(r'Subject:\s*【.*】(.*?)\s*$', s) ``` で、確かに得られる出力となりますね。 ありがとうございました。
otn

2020/07/12 02:26

> 「このような」の後の空白を 「控えめ」は、「マッチするなかで最短」なので、マッチしない場合は関係ないです。
shinjukuzame

2020/07/12 02:34

>「マッチするなかで最短」なので、マッチしない場合は関係ない ! なるほど、ありがとうございます!!!
guest

0

re.sub で文末の空白を消してから処理してはどうでしょう?

p.py

python3

1import re 2 3s = "Subject: 【件名】このような 件名 がある   " 4 5s1 = re.sub(r'[ |\s]*$', '', s) 6match_case = re.findall(r'Subject:\s*【.*】(.*)$', s1) 7print(match_case[0])

実行例
イメージ説明

投稿2020/07/12 01:54

katoy

総合スコア22324

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

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

shinjukuzame

2020/07/12 02:31

コメントありがとうございます。 処理分解して単純化するアプロ―チ、参考になりました。 実行結果までご丁寧に、ありがとうございました!
guest

0

正規表現だけだと大変なので、以下のように処理を組み合わせる方法をお薦めします。

Python

1import re 2 3for src in [ 'Subject: 【件名】このような 件名 がある   ', 4 'Subject: 【件名】', 5 'Subject: ']: 6 7 print(f'src[{src}]') 8 9 # 「【件名】~」を抽出 10 pos = src.find('【件名】') 11 dst = '' 12 if pos >= 0: 13 dst = src[pos:].rstrip() # 右端の空白(タブ、改行も含む)を削除 14 15 print(f'dst[{dst}]')

投稿2020/07/11 23:27

can110

総合スコア38341

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

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

shinjukuzame

2020/07/12 02:28

ご回答ありがとうございます。 >正規表現だけだと大変 勇気づけられました(笑) 具体例まで、ありがとうございました
guest

0

ベストアンサー

投稿2020/07/11 23:01

y_waiwai

総合スコア88042

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

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

shinjukuzame

2020/07/12 02:26

早々のご回答ありがとうございました。 最も回答が早く、かつ現在の自身の技量の身の丈にあった手法であったため、BAとさせていただきました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問