Regular Expression(正規表現) Part16

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2021/11/03(水) 19:50:01.71ID:ebAE+z9+
Regular Expressionスレです。

質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。

前スレ
Regular Expression(正規表現) Part15
https://mevius.5ch.net/test/read.cgi/tech/1568640311/


次スレは>>980宜しく
天ぷら等>>2以降
2022/05/24(火) 04:21:55.25ID:SL15aOsO
質問させてください。
荒らし対策に「読点2回」を指定するNG表現を作ってみたのですが、一応機能しました

(.*\、.*\n*){2}

上記はもっと簡略化できるでしょうか?
2022/05/24(火) 04:27:32.12ID:7Wh7VSQ0
、.*?、
2022/05/24(火) 04:43:45.06ID:SL15aOsO
>>263
即答ありがとうございます

(10文字以上、){2}

のように「10文字以上、」が2回以上あったらNGというプログラムも教えてくれますか?
2022/05/24(火) 05:20:15.74ID:SL15aOsO
すみません、ありがとうございました。
266デフォルトの名無しさん
垢版 |
2022/05/25(水) 21:16:43.73ID:rVRUpzpa
自分が書いた正規表現を半年後くらいに見たら
何の処理なのか思い出せない。
正規表現って便利だが、そう言う点が唯一のデメリットだよな。
2022/05/25(水) 21:33:08.27ID:JiQQrvQ9
>>264
(10文字以上、){2,}
2022/05/25(水) 22:10:02.21ID:SBYC3EV0
(?#何の処理)
269デフォルトの名無しさん
垢版 |
2022/05/26(木) 10:08:16.60ID:Nn08GFXz
●Regular Expressionの使用環境
PowerShell 7.2.4

●検索か置換か?
置換(-replaceもしくは[regex]::Replace)
もしくは抽出(-match)
●説明
ドメインからサブドメインを取り除いた値が欲しい

●対象データ
www.example.com
hoge.www.example.com
hoge.hoge.www.example.com

●希望する結果
example.com
example.com
example.com

お願いします
2022/05/26(木) 10:11:53.48ID:Nn08GFXz
>>269
すいません、これだと「example.com$でいいだろ」になりますね
バラバラなURL、つまり
●対象データ
www.example.com
hoge.www.test.com
hoge.hoge.www.foo.com

●希望する結果
example.com
test.com
foo.com

でお願いします…
2022/05/26(木) 10:34:55.49ID:6qaNDFBW
powershellでの書き方は分からんが
[^.]++\.com$
2022/05/26(木) 10:51:21.71ID:Ax+O2qu3
>>271
それで得られるの.comドメインだけじゃね
2022/05/26(木) 11:26:16.23ID:JFz3AkL/
(?m:((?:[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*)\.[a-zA-Z]{2,})$)
274デフォルトの名無しさん
垢版 |
2022/05/26(木) 13:28:50.78ID:DqYj7elt
[a-zA-Z0-9]
って、何かもっと短いパターンに置き換えられないのかな?
2022/05/26(木) 13:51:27.22ID:Nn08GFXz
>>272
ごめんなさい。私がちゃんと.com以外の例を出してませんでした。

>>273
ありがとうございます。
[regex]::Matchesの方で抽出できました。
もしよければ、今後のためにどういう意味の正規表現になってるかお教えいただけませんか
行末→$)
エスケープして.(ドット)+2文字以上の文字→\.[a-zA-Z]{2,})
までは分かるのですが、
(?:[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*)

(?m:
がよくわかりません…
2022/05/26(木) 14:03:59.49ID:Ax+O2qu3
>>274
/S
2022/05/26(木) 14:08:45.47ID:gYa8SY15
>>274
処理系にもよるけど\dと[0-9]は同等でないこともある(漢数字にもマッチする処理系や環境がある)
[:alpha:]は使えない処理系もある

>>275
ドメイン名の制約を正規化
mは行単位処理指定(一般的には不要)
2022/05/26(木) 14:26:21.96ID:SI03/myz
結局太古からの文字クラスが役に立つよな
2022/05/26(木) 14:57:41.65ID:0Pd9G99m
5ch.net
2345.com
2022/05/26(木) 19:34:14.75ID:DerQuI+6
8823
281デフォルトの名無しさん
垢版 |
2022/06/15(水) 16:12:07.21ID:D17rKkfp
Pythonで、下記のような仕組みを作りたいと思っています。

1 テキストを入力する。
2 あらかじめ用意してある複数の正規表現のパターンでテキストを検索し、
それぞれのパターンにマッチする部分のテキストを色分けする。
3 それぞれの色ごとに、別々の処理をする。

こう言う表示をするためのフロントエンドというか、ライブラリというか、
そう言うものはないでしょうか。
例えば、VBAなら、エクセルやWordの文字プロパティを操作すればできると思うのですが、
そう言うもののPython版というか…
2022/06/15(水) 17:05:28.57ID:GqhFDJ5g
>>281
スレチ
2022/06/15(水) 20:56:26.63ID:bRSTMa0S
こういうの不思議なんだけど、
仕組みを作りたいと思っていて、ライブラリやフレームワークすら選べてないのに、
なんで使用言語は決まってるんだろうか
284デフォルトの名無しさん
垢版 |
2022/06/15(水) 21:12:53.05ID:74xVOU49
そのライブラリはlispとprologとVHDLしかありませんって言われたら困るし
2022/06/15(水) 21:17:39.12ID:bRSTMa0S
そしたらその言語選ぶだけじゃないかな
2022/06/16(木) 02:58:48.52ID:5RJuUFJv
JSで作ってブラウザ上で動かすのがよさそう
287デフォルトの名無しさん
垢版 |
2022/06/24(金) 15:59:53.62ID:P24pDyi3
●Regular Expressionの使用環境
python3

●検索か置換か?
検索

●説明
START~次のSTARTの直前までをマッチングさせたい
START含む行から文字列足して行けば同じ事は出来るんですが正規表現ではどのように書くのか分からないのでお願いします

●対象データ
START 1: abcd
hoge
fuga
START 2: efgh
hoge hoge
fuga fuga
piyo piyo

●希望する結果
START 1: abcd\nhoge\nfuga
2022/06/24(金) 16:36:46.31ID:ECcLc/fl
>>287
START(?:(?!START)[\S\s])*
289デフォルトの名無しさん
垢版 |
2022/06/24(金) 16:39:49.07ID:P24pDyi3
>>288
早速の回答ありがとうございます
希望した結果が得れました
290デフォルトの名無しさん
垢版 |
2022/06/24(金) 18:26:54.64ID:0z9KCe6G
template<>引数にはclassでない定数リテラルを指定できるのでtypenameのほうが名称としてしっくりくる
2022/06/25(土) 08:38:53.00ID:hlZoB8IO
Onigmoの非包含オペレータのバグFixが来た

Fix absence operator #163
https://github.com/k-takata/Onigmo/pull/163

こういうのをサラっと直してしまう人はカッコイイね、nomotoさんありがとう!
292デフォルトの名無しさん
垢版 |
2022/06/25(土) 10:59:37.90ID:23CjKpU2
>>290
https://mevius.5ch.net/test/read.cgi/tech/1653135809/294-295
2022/06/28(火) 22:14:32.48ID:r8H2D3+U
>>291
> n("(?~|abc)", "abc") # ???
> x2("(?~abc|)", "abc", 0, 1) # ???

けんちゃん最初から気付いてるし
294デフォルトの名無しさん
垢版 |
2022/06/30(木) 19:21:01.41ID:EErfRwVa
●Regular Expressionの使用環境
python3

●検索か置換か?
検索

●説明
ErrorもしくはwarnもしくはInfoから始まり(CODE-xxx)で終わる最短の文字列を抜き出したいんですが
(Error|Warn|info):.*?\(\w+-\d+\)のように最短マッチを使っても1番最初のErrorから最後の(CODE-xxx)までが
マッチしてしまいます

●対象データ
Error: hoge
hoge
Warn: fuga
fuga
fuga
Info: hoge
fuga fuga (CODE-003)

●希望する結果
Info: hoge\n fuga fuga (CODE-003)
2022/06/30(木) 19:55:03.39ID:5rlmwso+
^(?:Error|Warn|Info)(?~^Error|^Warn|^Info)\(CODE-\d++\)
296デフォルトの名無しさん
垢版 |
2022/06/30(木) 20:03:45.67ID:VljocFtJ
>>294
msg_type_re = r"(?:(?:Warn|Info|Error):)"
print(re.findall(rf"{msg_type_re}(?:(?!{msg_type_re}).)*?\(CODE-\d+\)", s, flags=re.S))
2022/06/30(木) 20:43:19.23ID:WhOCvrbe
^(?:Error|Warn|Info):.*(?:\n\ \ .*)*?\(CODE-\d+\)
https://regex101.com/r/h3PLIu/1#TKStH49zfF1UDOMNbfx1RWny
298デフォルトの名無しさん
垢版 |
2022/07/01(金) 08:10:56.97ID:FKzEqydA
秋葉原店
専門店

住所
〒101-0021 東京都千代田区外神田4丁目3-3

↑の文字列を、置換で、
「秋葉原店,東京都千代田区外神田4丁目3-3」
と成形したいです。
思うに、
検索に、「店~~~~~~東京都」
置換に、「,」
とすれば出来そうですが、
「~~~~~~」には何を入れればよいでしょうか?
299298
垢版 |
2022/07/01(金) 08:20:24.06ID:FKzEqydA
ようは、
「店」と「東京都」の間にあれば、改行を含み、どんな文字列が何個はいろうが、「,」に変えたいのです。
よろしくお願いします。
2022/07/01(金) 08:32:58.06ID:fIXdHuhM
テンプレガン無視するな
ここはお前の為の便利屋じゃねぇよ
2022/07/01(金) 08:56:54.62ID:6Nj9t6DP
環境を言わない質問にはオーソドックスな正規表現で答えれば良いと思う

検索
(店)[\s\S]*(東京都)

置換
$1,$2
302298
垢版 |
2022/07/01(金) 17:16:41.56ID:FKzEqydA
>>300-301
すみません。 環境はwzエディター10 64bitです。
で、
(店)[\s\S]*(東京都)
これではダメでした。
2022/07/01(金) 17:18:10.65ID:wWlIpSvA
意地でもテンプレは使わない
2022/07/01(金) 17:27:00.65ID:iqig0nNh
スルーされにくいテンプレだから
スルーされてもいいんでしょう
305298
垢版 |
2022/07/01(金) 17:28:06.12ID:FKzEqydA
>>301
教えてくれてありがとうございます。
で、
wzの置換のタブを見ると、「\を文字として検索」と書いてあってそこにチェックが入っていて、そのチェックは外せません。
306298
垢版 |
2022/07/01(金) 17:33:49.42ID:FKzEqydA
>>303-304
すみません。 テンプレで質問すると、↓になります。

●Regular Expressionの使用環境
wzエディター10 64bit

●検索か置換か?
置換

●対象データ
秋葉原店
専門店

住所
〒101-0021 東京都千代田区外神田4丁目3-3

●希望する結果
秋葉原店,東京都千代田区外神田4丁目3-3
2022/07/01(金) 17:34:03.71ID:C/EjaQqR
別のエディタなりsed使え
2022/07/01(金) 17:48:08.39ID:iqig0nNh
>>306
Notepad++、Meryでは以下でいけた

(.+店)[\s\S]*〒\d{3}-\d{0,4}\s(.+)$
$1,$2
309298
垢版 |
2022/07/01(金) 17:51:33.51ID:FKzEqydA
>>308
ありがとうございます。しかしダメでした。
310298
垢版 |
2022/07/01(金) 17:53:57.09ID:FKzEqydA
しかし、
(.+店)[\s\S]*
ここまで削ると食いついてきます。
2022/07/01(金) 17:58:53.83ID:Dqsnfi22
複数行な時点で環境限られるよね
312298
垢版 |
2022/07/01(金) 17:59:18.72ID:FKzEqydA
ちなみに、Notepad++、Meryどちらも無料ですが、インストールするとするとどちらがよいでしょうか?
313298
垢版 |
2022/07/01(金) 18:08:28.54ID:FKzEqydA
ちなみに、Notepad++、Meryどちらも無料ですが、インストールするとすると正規表現的にはどちらがよいでしょうか?
2022/07/01(金) 18:09:36.54ID:C/EjaQqR
(?<=店)[^〒]*?〒\d{3}-\d{4}\s++
,
キャプチャする必要無くね?
対象データの例が悪い
他に何件もあって〒が無い場合があったりすると誤マッチするはず
315298
垢版 |
2022/07/01(金) 18:15:22.87ID:FKzEqydA
>>314
ありがとうございます。しかし、 (?<=店) これにすら食いつきません。
316298
垢版 |
2022/07/01(金) 18:58:55.44ID:FKzEqydA
Notepad++をインストールしました。
で、やりたいことは、
https://www.donki.com/store/shop_list.php?bsns=&pref=13
ここから、べーっとマウスでコピペして、
Notepad++に貼り付けて、店舗名,住所のcsvファイルを作りたいのです。
317298
垢版 |
2022/07/01(金) 19:04:57.22ID:FKzEqydA
(?<=店)[^〒]*?〒\d{3}-\d{4}\s++
これでほぼ出来そうです。 ありがとうございます。
318298
垢版 |
2022/07/01(金) 19:10:09.57ID:FKzEqydA
(?<=店)[^〒]*?〒\d{3}-\d{4}\s++
$1,$2

ちなみに、これって$1,$2という変数を使ってますよね?
(?<=店)[^〒]*?〒\d{3}-\d{4}\s++
この文のドコで代入してるのでしょうか?
2022/07/01(金) 19:16:15.59ID:TWCq9rfx
テンプレをヤイヤイいうだけの奴わろたわw
2022/07/01(金) 19:27:43.82ID:omlO1tMt
ページからならjsでやったら?って感じの話しだな
https://pastebin.com/M6LqV15b
2022/07/01(金) 19:30:02.45ID:23LeTIBQ
xy問題
2022/07/01(金) 19:51:17.10ID:6Nj9t6DP
住所からアニメイトの同志だと思いご協力させて頂きましたがアニメイトではなくドンキだと分かったので
すみませんがこれ以上ついて行くことは出来ません・・ 短い間でしたがありがとうございました、さよなら
323298
垢版 |
2022/07/01(金) 21:06:43.33ID:FKzEqydA
>>322
どうもです。 了解しました。

.+だと文字が何個あってもいいよ、です。
こういうので、
文字でも記号でも改行でも何個あってもいいよ、はないでしょうか?
あるとすれば、
店「」+住所
を、
,
に置換すればいいだけの話なんだけど。
2022/07/01(金) 22:01:19.33ID:TkUsKSE8
.(ピリオド)は改行コードを除く任意の1文字にマッチする
つまり.*や.+だと改行のところでストップするということ
2022/07/01(金) 22:28:36.91ID:oUsXu5GC
ピリオドはmオプションつけると改行にもマッチするやで
mオプションがついてるかは環境と指定したオプションによるやで
2022/07/01(金) 22:36:48.49ID:TkUsKSE8
mオプションじゃなくてsオプションなのでは?
2022/07/01(金) 22:50:04.22ID:oUsXu5GC
調べてきた
mオプションはRuby、oniguruma系、Meryはこれのはず
sオプションなのはPerl系
Notepad++/SciTEは専用オプションがある
らしい、やってみて確かめたほうがいいね
328298
垢版 |
2022/07/01(金) 23:07:58.13ID:FKzEqydA
ありがとうございます。では、
店.+東京都
に、mオプションを付けるとするとどう書けばいいのですか?
↓にはそれ系の記載がありません。

https://murashun.jp/article/programming/regular-expression.html
https://userweb.mnet.ne.jp/nakama/
2022/07/01(金) 23:25:18.67ID:oUsXu5GC
Notepad++のことならGUIのダイアログの左下の右に「.は改行と一致」てのがあるじゃろ
330298
垢版 |
2022/07/01(金) 23:40:21.16ID:FKzEqydA
>>329
ありがとうございます。Notepad++で、「.は改行と一致」にチェックをいれて、
店.+東京都
,
で、次を検索でポチると、
最初の東京都ではなく、最後の東京都、つまりほぼ全文を選択してしまいます。
2022/07/02(土) 00:04:51.39ID:BdV6t7uW
正規表現の基本は強欲
なるべく長い文字列にマッチしようとする
2022/07/02(土) 09:05:29.52ID:mrmEg2+h
> 基本は強欲

20年このスレにいて初めて知りました
2022/07/02(土) 09:58:17.51ID:At3W7bIA
20年正規表現使ってて強欲すぎて困ったことないの?
※ 用語として強欲はあまりいい意味には使わないから個人的には貧欲の方がいいなぁ
2022/07/02(土) 10:08:22.29ID:N6Y3zR8M
ひんよく? 貧
どんよく 貪欲
2022/07/02(土) 10:24:47.75ID:ophljRqK
そんなとっくに概出のこと言われても困ります
2022/07/02(土) 12:38:50.86ID:mrmEg2+h
貧欲の動作は考えてみればすごく非効率な気がしますね
10万文字の文章に対して「.*」を使ったら10万文字の末尾まで食ってから戻ってきますからね
2022/07/02(土) 13:18:37.74ID:At3W7bIA
>>334
すまん、素で間違ってたわ... orz
2022/07/02(土) 15:23:26.16ID:+K04BJMF
*+ 強欲 ++ 最大一致させたらバックトラックしない
* 欲張り + 最大一致させた後、残りの式が不一致になったらバックトラックする
*? 無欲 +? 欲張りと逆。最小一致後にバックトラック

バックトラック
条件を満たす範囲で探索
・欲張りは1文字放棄
・無欲は1文字追加
して試行する
339298
垢版 |
2022/07/02(土) 18:24:54.77ID:rrBNdWeF
てか、↓の文法的解説をできる方はこのスレにはいないのでしょうか?
(?<=店)[^〒]*?〒\d{3}-\d{4}\s++
2022/07/02(土) 18:51:12.29ID:+K04BJMF
(?<=店) 戻り読み。式(店)と次の文字の「間」の位置に一致。abcに対し(?<=ab)ならbとcの間に一致する。アンカー(^$)と同様
[^〒]*? 「〒」以外の文字に最小一致(無欲)
〒 「〒」の文字
\d{3}-\d{4} 「数字3つ」「-」「数字4つ」
\s++ 「\s」に最大一致(強欲)
341298
垢版 |
2022/07/02(土) 18:58:50.57ID:rrBNdWeF
>>340
ありがとうございます。
$1に(?<=店)を代入しているのはなんとなく理解できるのですが、住所の$2にはどの部分で代入しているのでしょうか?
2022/07/02(土) 19:30:02.98ID:UTWJe5+B
[^〒]*?〒は最小量指定子使わないで、[^〒]*〒でよいのでは?
この*は0回以上の「〒以外」の文字にマッチだから、貪欲であっても貪欲でなくても、結局一番初めに出てくる「〒」手前までしかマッチできない。
343デフォルトの名無しさん
垢版 |
2022/07/02(土) 19:38:03.70ID:UTWJe5+B
>>336
貪欲のほうがコストが常にかかるかというとそうじゃない。
場合によっては非貪欲のほうが大量にバックトラックが発生して計算コストかかることもある。
344298
垢版 |
2022/07/02(土) 19:41:17.46ID:rrBNdWeF
てか、不思議なことに、
1、検索文字列→ (?<=店)[^〒]*?〒\d{3}-\d{4}\s++   置換文字列→ ,
2、検索文字列→ (?<=店)[^〒]*?〒\d{3}-\d{4}\s++   置換文字列→ $1,$2
で、同じ結果が出るんです
345298
垢版 |
2022/07/02(土) 19:42:31.78ID:rrBNdWeF
つまり、2は文法的に間違ってる、ってことですかね?
346298
垢版 |
2022/07/02(土) 19:45:54.43ID:rrBNdWeF
てか、Notepad++はカシコイから、
置換文字列→ $1,$2
を、
置換文字列→ ,
と、置き換えて処理してるんですかね?
2022/07/02(土) 19:46:39.19ID:+K04BJMF
面白いから見守るわw
2022/07/02(土) 19:57:48.35ID:+K04BJMF
>>342
一致しない場合に無駄にバックトラックさせることになるだけなので
[^〒]*+〒
と強欲で良いんじゃね
2022/07/02(土) 21:11:04.97ID:FJKEiIOc
>>348
確かにマッチしない場合にバックトラックの発生を抑えるために強欲にするのはありだと思う。
ただ、PCREとかだと[^〒]*〒の場合、Auto Processが動作して勝手に強欲化するから書かなくてもいいはず。
今回のEditorはしらんけど。
2022/07/03(日) 11:46:22.30ID:DiSdIFQe
初心者のうちは強欲は使わないほうがいい気がする

そもそも鈍器のページから店名と住所を取り出すだけの正規表現を書く場合にキャプチャしない書き方や
バックトラックを抑制する書き方をする必要はない

「策士策に溺れる」になってるから質問者に何を教えるべきなのかもう一度考えるべし
2022/07/03(日) 12:00:27.48ID:J9cIk4yD
貪欲禁止って*や+を使うなってことけ?
2022/07/03(日) 12:44:06.06ID:HH+h1Cia
possessiveのことだろ
2022/07/03(日) 13:50:59.22ID:J9cIk4yD
手足をもぎ取られた気分や…
2022/07/03(日) 14:32:42.77ID:nkFK6+7O
>>350
初心者が強欲使わないでいつ強欲の動作を知るの?
それとも初心者はみんな量指定子を持つ環境を使うべきって主張かな?
2022/07/03(日) 15:36:23.88ID:ZjFQgG61
> 使わないほうがいい気がする
「気がする」でついつい無駄コード書いちゃう強迫性不安障害の人かな?

> 「策士策に溺れる」になってるから質問者に何を教えるべきなのかもう一度考えるべし
底辺コーダーが良く使う言い訳
(俺に分かりやすい) 平易なやり方しか認めない!(`・ω・´)キリッ
2022/07/03(日) 17:56:24.35ID:DiSdIFQe
正規表現を考えるときには複雑な情報を単純化する作業が必要になるんだがそういう意味では質問者のほうが才能がある
「店」と「東京都」という2つのキーワードさえ見つけられれば目的を果たせることを見抜いていた

それに対して回答者たちは単純だった依頼を複雑化させたあげく質問者を困らせ続けた
戻り読みを正規表現の先頭に置いてキャプチャを回避することが本当に処理量の軽減になっているのかも疑問
鈍器のページからテキストエディタで店名と住所を取り出すだけの作業に正規表現の高速化を考えるのはもはやコント

君らには問題を単純化する能力が足りないからその点を改善せよ
2022/07/03(日) 18:00:06.22ID:ZjFQgG61
>>356
>>340
店の直後から郵便番号まで、と十分に単純だと思うが君はこれが複雑なものに見えるのかな?
2022/07/03(日) 18:09:59.22ID:hqJYlR9w
>>356
取り敢えず君は書く文章を改善しよう
殆ど愚痴だよねそれ
2022/07/03(日) 18:20:19.30ID:K4HcDkkQ
どうしようもないケースを除いて「東京都」なんてのをハードコーディングするのは筋が悪いと言わざるを得ない
2022/07/03(日) 18:23:09.07ID:BZUl5BA7
それはともかく、キャプチャグループが無いのに気づいてないのを指摘してあげろよ
$1,$2に対応するものがないので両方ともヌルになってる
2022/07/03(日) 18:34:54.70ID:BC52HWP8
>>344
>>346
不思議だとかカシコイだとか面白すぎるんですけどw
それ書いてる>>314には$1なんてどこにも書いて無いのにw
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況