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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

正規表現

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

Q&A

解決済

1回答

4113閲覧

正規表現 複数ある検索対象の最後にマッチさせる方法

opyon

総合スコア1009

Python 3.x

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

正規表現

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

0グッド

0クリップ

投稿2018/09/18 12:43

編集2018/09/18 13:35

正規表現を使ってファイルの拡張子などを取り除きたい
上記質問は解決済みなのですが回答が明記されてないので自力で解こうとしているのですが迷走中です。

参考にしたサイトなど
Pythonでの正規表現の使い方
正規表現サンプル集
re --- 正規表現操作

###やってみたこと
フルパスのファイル名だと複雑なのでまずは1-2-3-4-5というサンプル文字列で試しています。
-を検索して次の文字2を出力するところまで出来ました。

###実現したいこと
-が複数ある場合に最後の-にマッチさせるにはどのようにしたら良いのでしょうか?
この例ですと最終的に5を出力したいです。
ヒントでも良いのでご教示頂ければと思います。

Python3

1import re 2str = '1-2-3-4-5' 3pat = re.compile(r'(?<=-)\w+') 4ret = pat.search(str) 5 6if ret: 7 print(ret.group())

出力結果
2

###実現したいこと2
-\に変える。

-追記-
何故か.csvを付けても目的の55555が取り出せましたのでこれで完成としておきます。

Python3

1import re 2str = r'C:\111\222\333\444\55555.csv' 3pat = re.compile(r'.*\(\w+)') 4ret = pat.search(str) 5 6print(ret) 7if ret: 8 print(ret.group(0)) 9 print(ret.group(1))

出力結果
<re.Match object; span=(0, 24), match='C:\111\222\333\444\55555'>
C:\111\222\333\444\55555
55555

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

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

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

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

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

guest

回答1

0

ベストアンサー

グループを使わないと無理だと思います。

Python3

1import re 2str = '1-2-3-4-5' 3pat = re.compile(r'.*-(\w+)') 4ret = pat.search(str) 5 6if ret: 7 print(ret.group(1))

投稿2018/09/18 13:01

otn

総合スコア84555

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

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

opyon

2018/09/18 13:25 編集

ありがとうございます。5が出力されました。 その後サンプル文字列の-を\に変更して、コードも-から\に変えてみたところ、 https://gyazo.com/ea03a5cfd475687849f65a15e3bf126b 結果がNoneとなって何も出力されないのですが、\を検索するのに\では無いのでしょうか? 別質問になってしまい恐縮です。質問を編集します。
otn

2018/09/18 13:25

str = r'1\2\3\4\5' か str = '1\2\3\4\5' ですね。 文字列中に \ を書くには \ です。
opyon

2018/09/18 13:36

やりたいこと2として編集済みです。
退会済みユーザー

退会済みユーザー

2018/09/18 13:37

[^-]+$ ではどうですか
otn

2018/09/18 13:42

> この例ですと最終的に5を出力したいです。 に注目すればそうですね。私は、 > -が複数ある場合に最後の-にマッチさせるにはどのようにしたら良いのでしょうか? に注目しました。
opyon

2018/09/18 13:48

皆様のセンスに脱帽です。私個人では到底思いつけないコードでした。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/09/18 13:49

回答のコードは最後の-にマッチというわけではないようでしたので……
opyon

2018/09/18 13:52

はい、最初の質問時点での要件は満たしています。 回答を頂いた後に追加で質問をしてしまい分かりづらくなってすみません。
otn

2018/09/18 13:55

なるほど。厳密に言えばそうですね。求める物が存在しないケース(最後の-の後に\w+が無い)まで考えると1つの正規表現だけでは難しそうです。
otn

2018/09/18 13:58

>opyonさん いや、denchiさんが言ってるのは、str = '1-2-3-4-5-' みたいなときに、私の解だと最後の - にマッチするわけでは無いと言うことです。
opyon

2018/09/18 14:00

冒頭にも書いた別の方の質問では、「フルパスファイル名から拡張子を除いたファイル名のみを取得する」が要件でしたね。 ファイル名ですので最後の\の後ろに必ず何か(ファイル名+.csv)あるので問題ないと思います。
opyon

2018/09/18 14:03

>>str = '1-2-3-4-5-' のようなケースを考慮する際には確かに仰る通りですが、 「フルパスファイル名から拡張子を除いたファイル名のみを取得する」要件では考慮しなくても大丈夫そうです。 細やかなお気遣い本当にありがとうございます。
退会済みユーザー

退会済みユーザー

2018/09/18 14:11

いや、ごめんなさい。otnさんの回答だと、グループを使わないと無理と言いつつ「最後の-」じゃなくて「5」を取り出してるじゃないですか。で、それならグループを使わなくてもいいんじゃないかなーと思っただけです。 拡張子の話をすると、二重拡張子を考慮した方がいいと思いました。
otn

2018/09/18 14:16

ああ、そういう意味でしたか。質問のコードを見て、「最後の-の次の\w+」を取り出したいと言うことかと解釈しました。
opyon

2018/09/18 14:18

今更なのですが、やりたいこと2に書いてある、.csvが取り除かれてる理由は何故でしょうか? str = r'C:\111\222\333\444\55555.csv' ←これです
退会済みユーザー

退会済みユーザー

2018/09/18 14:31

.が\wにマッチしないからですね。 ファイル名は必ずしも\wにマッチする文字ばかり使うわけでもない(記号や漢字など)ので、なんというか、たまたまうまくいっている感じだと思います。
otn

2018/09/18 14:34

実用的に拡張子を取り除いたファイル名が欲しいのなら、専用のライブラリを使います。 前の質問でアドバイスされているpathlib。
opyon

2018/09/18 14:35

これですか!なるほど、ありがとうございます。 \w 単語構成文字:[a-zA-Z_0-9]
opyon

2018/09/18 14:36

前の質問で見落としてましたね。 pathlibも検索してみます。
opyon

2018/09/18 14:43

便利そうなものがたくさんありましたし、想定外のことを考えると正規表現よりも正確そうですね。 正規表現から派生してpathlibのことも知れてとても参考になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問