2017-06-13 2 views
0

は、私はこれらのような数千行のテキストファイルがあります。コンマの前または後にカンマがあるのを見つける方法?

8/15/2016,,Amazon,,15.93 ;most are like this 
8/24/2016,,Google,18.73 ;a few are like this - one comma only 
8/26/2016,,Ebay,,60.2 ; 

ラインのほとんどは数値に続いて、別の2つのコンマに続くいくつかのテキストに続いて2つのコンマを、持っています。わずか数十の線は二行目のようなものです。数値の前にカンマが1つしかありません。

私はこれらの数十の線を見つけるためにRegexを使用しようとしています。私はプログラミング言語、メモ帳++を使用していません。私の問題は、これまでに登場してきた正規表現は、これまでのところ両方をキャッチしているということです。私はあなたが数字の桁が続くコンマを見つけるまで、それは任意の数の文字が続く,, 2016の検索」を意味するだろうと思った2016,,.+?,[0-9]

:私はこのような何かを得たregex101.com

で実験してきました1行か2行のコンマがあっても、それが何であるかを知るために追加したときにわかるように、すべての行が見つかります。

正規表現は「greedily」を検索しましたが、.+の後の疑問符は、最初に検索が停止したと考えました。

私はと思っても "ただ一つ"を意味すると考えましたが、それはどちらもうまくいきません。

+0

@mickmackusaうん、同じくらい私はポスターは違いを知らないと魅力的なことで振り回されるプロセスと競合する必要が専門家として、説明しようとして、ハイライト/インデント、不必要な情報を含むことがあります。実際には、私の1900程度の答えは、私の約5000のコメントで覆われています。しかし、私は教育者として、他には何もありません。そして、正規表現を正しい方法で学ぶことを真に望んでいます。 – sln

答えて

1

ため.+?2016,,.+?,[0-9]の除外のみ最後のコンマ:

  ▼▼▼▼▼▼▼▼▼ 
8/15/2016,,Amazon,,,,15.93 

ねえ、それはのいずれかですキャラクター、そうですか?

negated characters classを使用•:

2016,,[^,]+,[0-9] 

negative lookahead/lookbehind(注意を使用して•、いくつかの正規表現エンジンは++メモ帳ものの、それらをサポートしていないここにいくつかの選択肢があるけれどもの


コード別の答えは、結構です見た目は固定長でなければならない):

+1

Gras Doubleの "look-both-ways"パターン '(?<!、)、(?!、)'は、最高のパターン(超リテラル '2016 ...'パターンを無視する)は、単一のコンマ** 54 **ステップで - 「置換」する必要のあるキャプチャグループはありません。 CodeDifferentが掲示したように、否定の文字クラスを使用すると、** 135 **ステップがかかります - あなたが** 200 **までステップを傾斜させるキャプチャグループを必要とするため、置換を実行したい場合は悪化します。記録のために、 '。* [^、](、)[^、]。*'は** 194 **ステップを取る。 – mickmackusa

+0

ありがとうございました!これを明確にすることはできますか?私は '。+'が任意の文字の1つ以上を意味することを知っています。そしてRegexの検索は通常可能な限り多くのものを取りますので、 '。+ 'は最初の行ではなく最後のカンマまでを意味します。 '? 'は最初のカンマにあったはずの満足している間に検索を停止しました。私の理解が間違っているところはどこですか?ありがとう。 – RobertSF

+1

「できるだけ早く食べる」ことを意味するのではなく、「食べる可能性が低い」**「まだ一致している」**を意味します。 '。+?' **はすべてのカンマ(1つ少ない)をつかむために**、[0-9]は1つのみを取ります。 –

1

あなたは先行し、また別のカンマが続いていませんカンマ試すことができます:あなたが行全体をキャプチャしたい場合は、開始と終了に.*を追加

[^,],[^,] 

を。あなたが唯一のコンマを含む行を選択したい場合はRegex101

0

を使用でき、この

.*[^,],[^,].* 

しかし、あなたは、二重カンマやbiceversa、次のことができ

Ctrl + Fキーでカンマを置き換える場合>、>見つけるすべて> supr> ,,(または、)

0

否定アサーションを使用して単一のカンマを検索する場合、
アサーションがの場合は、の後にリテラルのカンマを付ける方がはるかに高速です。

最初に正規表現に負のアサーションを付けると、リテラルを最初に見つけてからアサーションで確認するよりも、6xオーバーヘッド(この場合)が
になります。

それだけでリテラル最初の発見とは対照的に、すべての
文字位置のスタック上アサーションを実行するために持っているためです。グッド

= ,(?!,)(?<!,,)悪い = (?<!,),(?!,)

比較

ターゲットは、文字列29回複製さ。

8/15/2016,,Amazon,,15.93 ;most are like this 
8/24/2016,,Google,18.73 ;a few are like this - one comma only 
8/26/2016,,Ebay,,60.2 ; 
... 
8/15/2016,,Amazon,,15.93 ;most are like this 
8/24/2016,,Google,18.73 ;a few are like this - one comma only 
8/26/2016,,Ebay,,60.2 ; 
... (29 times total) 

ベンチマーク

Regex1: ,(?!,)(?<!,,) 
Options: <none> 
Completed iterations: 50/50  (x 1000) 
Matches found per iteration: 29 
Elapsed Time: 5.92 s, 5919.16 ms, 5919161 µs 


Regex2: (?<!,),(?!,) 
Options: <none> 
Completed iterations: 50/50  (x 1000) 
Matches found per iteration: 29 
Elapsed Time: 36.81 s, 36806.16 ms, 36806159 µs 
+0

これは興味深い選択肢ですが、Gras Doubleのパターンのステップは、パターンよりも常に少なくなります。相当に変わると思われるのは、個々のテストの経過時間です。あなたのベンチマークと対戦するテスト結果をご覧ください。 http://imgur.com/a/wxYLy真実は、経過時間に矛盾がありますが、手順は常に信頼できることです。経過時間に影響する他の要因があるようです。 – mickmackusa

+0

@mickmackusa - **パート1:**ええ、ここには多くの要因が関係しています。私はこれに深く入りたくないが、ここに行く。 2つの正規表現が与えられていると仮定して、2つのサンプルS1 = _ comas_を考えてみましょう。 S2 = _all letters_を各正規表現に使用します。 PCREとPerlの両方が_S1_に対して約0ステップを取る。 PCRE、Perlは極端な最適化を行います。コンマが見つからない場合、ターゲット内で正規表現の指示は処理されません。したがって、いずれかのベンチマークは無意味です。パフォーマンス情報は得られません。 Pythonに移行すると、より正確なプロファイルを集めることができます。 – sln

+0

@mickmackusa - **パート2:**(Python)2つの正規表現でS2(文字)を使用すると、 '(?<!、)、(?!)'で2倍以上のステップが使用され、 %30時間以上。相違点は、これが毎回満足されることであり、文字列 '、'をチェックしなければならないということです。 S2(カンマ)を使用してテーブルを逆にすると、ほぼ逆の結果が得られますが、 '、(?!)(?<!,,)'ではそれほど悪くはありません。途中のどこかにブレークポイントがあります。しかし、私はしばしばコンマと非コンマの数は同じではありません。 – sln

関連する問題