🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

正規表現

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

Q&A

解決済

2回答

567閲覧

python 正規表現: 指定の文字を取り出したい

john_doe_

総合スコア354

Python 3.x

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

正規表現

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

0グッド

0クリップ

投稿2021/01/06 04:22

やりたいこと

正規表現を利用して、文字列から指定キーワードに合致した文字を取り出したい

例: 定年と定年退職の2つの文字が含まれていることを確認したい

elem = '定年と定年退職' re.search('(定年)|(定年退職)',elem).groups() output: ('定年', None) # 検索wordの順番を逆にしてfindall関数を利用すると上手くいく re.findall('定年退職|定年',elem) output:['定年', '定年退職']

検索キーワードの順番に関係なく、['定年', '定年退職']を取り出す方法はありますでしょうか?
正規表現に関する資料を参照したものの自己解決できなかったためご質問させていただきました。

大変稚拙な質問かとは存じますが、ご教示いただけましたら幸甚でございます。
何卒よろしくお願い申し上げます。

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

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

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

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

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

ppaul

2021/01/06 05:10

定年退職だけが含まれていて、定年だけの単語がない場合には見つからなかったとしたいのでしょうか?
guest

回答2

0

ベストアンサー

質問があいまいですので、回答に困ります。

"山田さんは定年退職しました"という文字列が与えられたとき、それは定年と定年退職を含む文字列と判定したいのでしょうか。それともそうでないと判定したいのでしょうか。

また、この質問は"定年"と"定年退職"だけについて回答すれば良いのでしょうか。それとも一般的に複数の文字列を指定した場合を含んだ質問なのでしょうか。

質問によって、ひとつの正規表現で見つけられるものもあれば、ある程度長いプログラムを書かないと出来ないものもあります。汎用的なコードを作れない可能性もあります。

john_doe_さんの希望に沿っているかどうかわかりませんが、回答の案を作りました。
定年と定年退職を区別して全部取り出すと言う条件と、順序を取り替えても結果が同じという条件は満たしています。

pythn

1re.findall('定年(?!退)|定年退職', elem) 2re.findall('定年退職|定年(?!退)', elem) 3

実行してみます。

python

1>>> re.findall('定年(?!退)|定年退職','定年になった山田さんは定年で退職しました') 2['定年', '定年'] 3>>> re.findall('定年(?!退)|定年退職','定年になった山田さんは定年退職しました') 4['定年', '定年退職'] 5>>> re.findall('定年(?!退)|定年退職','定年退職になった山田さんは定年で退職しました') 6['定年退職', '定年'] 7>>> re.findall('定年(?!退)|定年退職','定年退職になった山田さんは定年退職しました') 8['定年退職', '定年退職'] 9>>> 10>>> re.findall('定年退職|定年(?!退)','定年になった山田さんは定年で退職しました') 11['定年', '定年'] 12>>> re.findall('定年退職|定年(?!退)','定年になった山田さんは定年退職しました') 13['定年', '定年退職'] 14>>> re.findall('定年退職|定年(?!退)','定年退職になった山田さんは定年で退職しました') 15['定年退職', '定年'] 16>>> re.findall('定年退職|定年(?!退)','定年退職になった山田さんは定年退職しました') 17['定年退職', '定年退職']

投稿2021/01/06 09:23

編集2021/01/06 12:35
ppaul

総合スコア24670

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

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

john_doe_

2021/01/06 11:56

ご高覧いただきまして誠にありがとうございます。また質問内容が言葉足らずで申し訳ございませんでした。 定年と定年退職を含む文字列と判定したい、と考えております。 簡易に抽出できる方法があると思っておりましたが、そうではないようですね。
ppaul

2021/01/06 12:06

"山田さんは定年退職しました"は単独「定年」がないので条件を満たしていない、と理解しましたが、それで合っているでしょうか。
john_doe_

2021/01/06 12:07

ご認識の通りです。
john_doe_

2021/01/06 15:09

ご親切に色々な実行結果をご教示いただき誠にありがとうございます。 正規表記の理解が浅かったので、大変、大変助かりました。
guest

0

Python の re.search はマッチする最初の一つを探索する関数で、複数探索するには re.findall を使うしかありません。また、正規表現は貪欲にマッチするので 定年|定年退職 だと 定年 が先にマッチしてしまいそれでおしまいとなります。
Regex Tutorial - Alternation with The Vertical Bar
これを回避するには順序に気をつけるか ? を用いて 定年(退職)? とすると良いでしょう。

投稿2021/01/06 05:36

A_kirisaki

総合スコア2853

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

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

john_doe_

2021/01/06 11:53

ご教示いだきましてありがとうございます。 やはり順番に気をつけるしかないのですね。 下記を試してみましたが、’定年’しか抽出できませんでした。。。。 re.search('定年(退職)?',elem).group() output: '定年'
A_kirisaki

2021/01/06 11:58

話聞いてた!?!!? > Python の re.search はマッチする最初の一つを探索する関数で
john_doe_

2021/01/06 12:11 編集

re.findall('定年(退職)?',elem) output: ['', '退職'] 期待した結果は得られませんでしたので、検索ワードの順番を操作して対処したいと思います。 ご教示いただきまして誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問