Regular Expression(正規表現) Part15
■ このスレッドは過去ログ倉庫に格納されています
Regular Expressionスレです。
質問する場合は必ず実装言語や処理系ソフトウェア名を示してください。
前スレ
Regular Expression(正規表現) Part14
https://mevius.5ch.net/test/read.cgi/tech/1489511075/
次スレは>>980宜しく
天ぷら等>>2以降 >663,664
有難うございました \s+ でつなげて上手くゆきました Pythonで以下の条件に当てはまる正規表現はどうしたら実現できるでしょうか。
半角英数字(大文字小文字)255文字までとハイフンのみOK
--の連続は不可。行末がハイフンで終わるのも不可
ここまではできてるんですが、どなたか知恵を頂きたいです。
^[a-zA-Z0-9-]*(?<!-)$ pythonなら正規表現だけで処理しなくても
抜き出した後に--が含まれるのを除くとかどうにでもなるだろ。 ^(?:(?!--)[a-zA-Z0-9-])*(?<!-)$
^(?!.*--)[a-zA-Z0-9-]*(?<!-)$
まあこの2つの書き方を覚えればいいんじゃない?
ただ空行もマッチしちゃうよ >>670
確かにそうですが、ちょっと格好つけたかったんです。
>>671
おぉぉぉぉありがとうございます。
とっても助かりました!!
おかげでこの先、頑張れそうです。。。(定時まで) 自分で理解できない正規表現とか組み込んで、この先メンテナンスできるんだろうか。
一時的なことならいいが この程度見れば何してるか理解できるよね
2つは記述は似てるけど考え方が少し違う 条件が曖昧なので2通り(定時回ってそうだが)
# ハイフン含めて255文字
^([0-9A-Za-z]|-(?!(-|$))){1,255}$
# ハイフンは255文字に含めない
^(-?[0-9A-Za-z]){1,255}$
>>675
試したら"?>"など知らんって言われた 単純に ^(-?[a-zA-Z0-9])[0,255]$ とかで良かったんじゃないかな みなさんありがとうございます。
こんな正規表現良く書いたねーって先輩のレビュアーに言われて、
詳しく説明してって言われたんですが説明できなかったので、
頂いた数々の秘技を頑張って理解していこうと思います。(定時まで) 以前使っていた正規表現の質問専用スレが見当たらないからここで聞きたい
javascriptで以下のマッチングを行うとマッチするけど、キャプチャの分が取得されない。
どうしたらいいんだろう
let abc = "/abcd/357/1/";
let regex = /^\/abcd\/(\d+)\/\d+\/$/gi;
let result = abc.match(regex);
console.log(result.length);
この出力が1になる。(\d+)も含めた2になってほしい matchAllかwhile regex.exec(string) !== null 解決したわ
gあるとキャプチャ取得されないって書いてあったわ
>>683
すまん 元データ
1621299591.842348,378,666,111,84
これをサブパターンで以下のように抽出したいです。
1621299591.842348
378
666
111
84
最終的な目的としては、ZabbixでCSV形式ログから値を取りたいです。
いろんなサイトを参考にしてるんですが、簡単そうに見えてこれが実現できる例が見つけられず。 >>685
それって正規表現で処理する部分なのか?
本当にそのままのデータなら/,/¥n/だろ。 >>685
Zabbixは1つの値で1つのitemなので
(.*),(.*),(.*),(.*),(.*)みたいな正規表現を使って$1~$5を出力するそれぞれ別の依存itemを登録するんじゃない? ありがとうございます。
logrt["/var/log/^.*\.txt$","^([0-9]+).([0-9]+),([0-9]+),([0-9]+),([0-9]+),([0-9]+)$",,,,\3,,]
こんな感じでできました。
ご指摘通り\3のところを\4や\5にしたアイテムを別途作成。 >>690
依存アイテムの保存前処理で上の正規表現入れてできました! こんにちは
質問です
●Regular Expressionの使用環境
普通のテキストファイル
いま Sublime text を使ってますが無料のエディタなら何でも使います
●検索か置換か?
置換
●説明
各パラグラフの1行目を2行目以下の全ての行に加えたい
1行目はパラグラフごとに異なり、2行目以下はすべて異なる
●対象データ
/system/app
AntHalService
AutoRegistration
BasicDreams
/system/priv-app
AutoKillService
BackupRestoreConfirmation
●希望する結果
AntHalService^=/system/app/AntHalService
AutoRegistration^=/system/app/AutoRegistration
BasicDreams^=/system/app/BasicDreams
AutoKillService^=/system/priv-app/AutoKillService
BackupRestoreConfirmation^=/system/priv-app/BackupRestoreConfirmation
よろしくお願いします 正規表現だけで可能なのか?
適当なスクリプト使った方が手っ取り早いような。 まずパラグラフをどう判断するかの条件も書かれてないしね
書かれてる2項目だけでいいならできるけど、
望むことはパラグラフの1行目の自動取得だろうし >>694
ちなみに、上記限定だったらどう書くの?
自分はちょっと思い浮かばない。 各段落1行目の前が空行でそれ以外に空行は無い とか
1行目行頭だけが"/"で他の行頭には"/"は無い とか
1行目だけが保ち得る条件が必要なのと
各段落の行数が同じで無いとキャプチャは出来ても置換で参照使えなくね?
・1行目の一意な条件
・段落の行数が一定
このふたつの条件満たさないと正規表現だけでは無理じゃね? 段落の最大行数に合わせて置換式書いておいて置換後
2度目に 行頭が "^=" の行を削除 なら行数不定でも出来るだろうけど
美しくないしスクリプトの方が適してると思う 可変長戻り読みしか思いつかなかった
>>692
https://regex101.com/r/DcrdT0/1
エディタ代わりにこのページを使うならUpdate Regexは絶対にするなよ みなさんありがとうございます
>>698
https://regex101.com/r/DcrdT0/1 のようにしても Sublime ではマッチしないんですが
おすすめのエディタはありますでしょうか?
また、
> エディタ代わりにこのページを使うならUpdate Regexは絶対にするなよ
なぜでしょうか? >>699
https://regex101.com/r/fg8u8n/1を見ればわかるとおり「対象とする文章も保存される」ため
一般的に漏洩したら問題でしょ? ●Regular Expressionの使用環境
サクラエディタ
●検索か置換か?
検索(正規表現で色を付けるため)
●説明
各行の最後に現れる:の直後から行末までを一致させたい
●対象データ
intval:i:1
strval:s:0,1,563,11,1913,1033
●希望する結果
1
0,1,563,11,1913,1033
よろしくお願いします :と改行以外が行末まで続くんだろ
:([^:\n]*)$
お願いしないといけないようなところあるか?
どーせ:はハイライトしたくないとかだろうけど
肯定戻り読み(?<=regex)使うだけだよな
(?<=:)([^:\n]*)$
これお願いしないといけないようなところあるのか? >>702
超ありがとうございました!
(肯|否)定(先|後)読みがうまく使えなくて・・・ ●Regular Expressionの使用環境
Powershell
●検索か置換か?
置換
●説明
フォルダにつけている日付のフォーマットを変えたい
作業範囲はカレントフォルダだけで良いです #下階層には行かない
●対象データ
[2020.12.20] AA案件 [作業者A]
[2021.04.02] DD案件 [作業者BB]
[2021.06.15] GGGGG案件 [作業者D]
[2021.07.07] BBB案件 [作業者A]
●希望する結果
[201220] AA案件 [作業者A]
[210402] DD案件 [作業者BB]
[210615] GGGGG案件 [作業者D]
[210707] BBB案件 [作業者A]
よろしくお願いします。 ほぼそのままだろ
www.atmarkit.co.jp/ait/articles/1411/07/news133.html pythonです
.foo.xxx_var
.foo.foo.yyy_var
この二種類の形式の文字列があるとき
xxxとyyyだけほしいんですがどう書いたらいいですか? def getxy(s):
return s[s.rfind('.')+1:s.rfind('_')]
a=getxy('.foo.xxx_var') ('.')
('_')
顔文字みたいで可愛くてワロタ >>708
rfind知りませんでした。ありがとう
不格好だけど
findall("(.+\.)?(.+)_var")[0][1]
でも取れました。正規表現てどんな順番で書いていけばいいのかわからん… s='.foo.xxx_var'
re.search('([^.]*)_',s).group(1) Ruby で作ってみた
# 最後のドットと、_ の間の文字列を抜き出す。該当なしなら、nil を返す
def slice_string( input_str )
pos_1 = input_str.rindex( "." ) # 文字列の末尾から探す
return nil unless pos_1
pos_2 = input_str.index( "_", pos_1 + 1 ) # ドットの次の文字から探す
return nil unless pos_2
return input_str.slice( pos_1 + 1 ... pos_2 )
end
input_ary = %w(.foo.xxx_var .foo.foo.yyy_var .zz zz)
p input_ary.map{ |str| slice_string( str ) }
#=> [ "xxx", "yyy", nil, nil ] 各言語でそれぞれ書き込む事態にでもならなきゃ自分の行いがいかにウザイかを実感できない人なんだろう
まったくの場違いだと言うのにそれに気づかないもんな 先頭以外の A をすべて S に置換
って一般解としてどう書くの?
AAAEAA を ASSESS にしたいとか 下URLにあるPerlのRegexp::Optimizerのように、正規表現を最適化するC/C++用ライブラリはご存じないですか?
https://metacpan.org/pod/Regexp::Optimizer ●Regular Expressionの使用環境
python3.8.5
●検索か置換か?
置換
●説明
<数字>以外の<>を外したい
●対象データ
[<< ><test<<012>>name1><> >]
●希望する結果
[ test<012>name1 ] 可変長の否定戻り読みが使えるなら
<(?!\d+>)|(?<!<\d+)>
数字の桁が3桁固定なら
<(?!\d+>)|(?<!<\d\d\d)> >>724
すいません、説明が足りなくて
可変長で、可変長扱えないです(´;ω;`) あれか
<(\d+)>のサイズ取得して動的にするのか… >>723
re.sub(r'(<[0-9]+>)|[<>]', r'\1', '[<< ><test<<012>>name1><> >]')
>>507のパターン
これ使い勝手良いね >>723
pythonなら正規表現だけにこだわらなきゃ<¥d+>さえ拾えばどうとでもなるだろ。 数値がネストした構造の一番内側にあるとは限らないんじゃないの? >>727
すごい
これどうなってるんですか?
なんでorの前のヤツだけ置換されるの? >>731
| の左右どちらに一致した場合でも \1 に置換している
ただし片方にしか \1 に対応する括弧がない——というのがミソ
左側 (<[0-9]+>) に一致したときの \1 は 一致した全体なので結果として何も変わらない
右側 [<>] に一致したときの \1 は空なので削除される <><abc><value<123<x>>/value><>
こういうパターンはあるのか? >>734
だからもしこういうのがあるのなら、上の回答じゃダメじゃん
<abc>は消えないぞ size = 4
s1 = entry.get()
s2 = re.sub(r'(<\d+>)|[<>]|[\\/:*?"|]+', r'\1', s1)
ss = [re.sub(r'<(\d+)>', lambda m: f'{{:0{len(m[1])}}}'.format(int(m[1])+i), s2) for i in range(size)]
簡単な範囲リネームソフト作ってて、windowsで使えない文字外して<数字>はカウントアップ がしたかったのでこれで大丈夫のようです.たぶん
入力(スタート値) dir<001>のとき リネーム範囲が2ならdir001,dir002を生成するみたいな でもさー
結局のところ自分の理解できる範囲で対処できないとブラックボックスでしかないから保守できないよな ネストがある構造物は、パーサーを使わないと保守できない。
Ruby のNokogiri みたいな、XML/HTML パーサー
正規表現でバグると、他人が手を出せないので、
結局、パーサーで作り直しになる
アンチパターンの常識
モジュール・デザインパターンの知識が無いから、
何にでも正規表現を使う、香具師と言われている ネストがある構造はRDBで管理するという方法もあるな >>727 のパターンは構造を見てない
ノンマッチな><だってホイホイ喰っちまう奴なんだぜ manの解析させるルーチンで無制限にネスト潜るの一度だけ書いたこと思い出したわ 1行に「半角スペースと全角スペースが3文字以上ある時」を検出するにはどうすればいいのでしょう? (.*\040|.*\201\100){3}
とかか >>747
SJISだったらこうしないとだめか
(([^\201-\237\340-\357]|[\201-\237\340-\357].)*(\040|\201\100)){3} ●Regular Expressionの使用環境
サクラエディタ
●検索か置換か?
検索(正規表現で色を付けるため)
●説明
各行の「CR」または「LF」の改行コード部分に一致(CR+LFは一致させない)
●対象データ
あ\r
い\n
う\r\n
●希望する結果
\r
\n
よろしくお願いします なんとか自分で調べて見たんですが、下の正規表現で合ってますか?
[\r\n](?!\n)$ (\r(?!\n))|((?<!\r)\n)
でどうだろう 文中もしくは単独で特定の文字列がある場合を除く
ってどうやるの? ^(?~特定の文字列)$
^(?!.*特定の文字列).*$ >>758
×非包含パラメータ
○非包含オペレータ >>759
他の正規表現とつなげると問題が起こる。
例えばコメントの直後にbbbが来るのを \/\*.*?\*\/bbb として
/* */aaa/* */bbb
にマッチさせると /* */aaa の部分も含んで全体がマッチしてしまう。 でも少なくとも解2でいいんじゃないか
表現力もたいして変わらない
数文字減るだけののシンタックスシュガーに見える ●Regular Expressionの使用環境
cygwin grep
●検索か置換か?
検索
●説明
テキストファイルに含まれる改行コードの検索
●対象データ
\r\n(0x0d0a)と\r(0x0d)が混在しているテキストファイル
●希望する結果
それらを検出して \r\nに統一したい。
grep -n -U -P '\x0d'
で検索をかけるとヒットするが
grep -n -U -P '\x0a'
ではなぜか1行もヒットしない
バイナリで確認すると0x0d0aはちゃんと存在しています・・。
とりあえずまずは0x0aを検索にヒットさせたいです。
その後
grep -n -U -P '\x0d[^\x0a]'
のような感じで0x0dの後ろが0x0aでない行を検索して置換できれば良いかなと考えています。
よろしくおねがいします >>764
-aも足してgrep -nUaPでも試してみては? ■ このスレッドは過去ログ倉庫に格納されています