2017-12-05 5 views
1

私は初心者のpythonプログラマーです。私はリストに追加するグループを構築するために正規表現を使用しようとしています。私は何をしたいかを単一の正規表現でカバーするか、複数の正規表現に渡す必要があるかどうかはわかりません。regexを使って空のグループを追加する

テストデータ:

云々云々0.003 40 40.00

yadayada屋55

yaaaaaaya 100.0000 4

私の正規表現:私は取得

(\w+ *\w* *\w*) (\d*\.*\d*) *(\d*\.*\d*) *(\d*\.*\d*)\n 

グループ:

'云々の云々'、 '0.003'、 '40'、 '40.00'

'yadayada YA'、'55'、空、空

'yaaaaaaya'、'100.0000'、」 4' 、

空が、私がしたいグループは、次のとおりです。

'云々の矢田'、 '0.003'、 '40'、 '40.00'

'yadayada' 屋、空、EMは、 PTY、'55'

'yaaaaaaya'、空、 '100.0000'、 '4'

は空(\ D *。* \ D *)基を導入するために正規表現を変更することは可能ですこれらのグループのうち3つ未満のグループに分けられますか?番号のグループが「右寄せ」されるように

追加しようとしましたか?最初の2つのグループ(\ d *)の終わりに移動しますが、同じ空のグループを取得します。

答えて

0

あなたが口頭で述べていることをマッチを「右詰め」することを行う最も簡単な方法は、i。 e。後のオプションの部分式のマッチングに優先順位を付けることは、オプションのコンポーネントの「貪欲」を逆転させることです。 Pythonの正規表現では、これは各定量化された要素に?を追加することによって達成される:あなたの表現は非常にリベラルで、特定の乏しい形成された入力を検証しません

(\w+ *\w* *\w*) (\d*?\.*?\d*?) *?(\d*?\.*?\d*?) *?(\d*?\.*?\d*?)\n 

注意を。これがうまくいく場合は、(| \d+(?:\.\d+)?)などの特定の部分をスペースや数字と怠惰にマッチさせるなど、特定の部分を貼り付けることを検討したい場合があります(構造(|x)((?:x)??)に相当)。

編集:この正規表現の欠点は、許容範囲以上のものを必要とし、入力がわずかに不正な場合でも壊滅的なバックトラッキングを引き起こす可能性があります。あなたはこの方法に固執することを計画している場合、私はもう少し正確に何かをお勧めします:

(\w+(?: \w+){0,2}) (|\d+(?:\.\d+)?) ?(|\d+(?:\.\d+)?) ?(|\d+(?:\.\d+)?)\n 

それはまだ不正な入力を一致させることができますが、少なくともそれは今少しタイトです。

+0

これは、空のグループマッチを返す正規表現の動作を変更しません。元のものと同じように壊滅的なバックトラックを起こす可能性があります。 –

+0

@TimPietzcker確かに、downvotingの前にテストしてください:https://regex101.com/r/dtKcH4/1正規表現が準最適であると同意し、それほど言及しません。もしあなたが彼のためにそれを書き直したいなら、先に進んでください。 – jaytea

+0

もちろん私はそれをテストしました。あなたのリンクされた例をチェックしてください。同じ問題があります(今は空のグループはグループ4の代わりにグループ2ですが、そこにもあります)。 –

0

あなたの正規表現にはいくつかの問題があります。その1つはcatastrophic backtrackingという高い危険性があります。一致しない場合に正規表現エンジンがテストする必要がある順列が急激に増加しているためです。もう1つの問題は、\wも数字と一致するため、最初のグループには含まれたくない数字が含まれている可能性があります。

さらに、このような「動的に成長する」正規表現では、\Gまたは\Kアンカーのような「一致継続」機能が必要ですが、Pythonではこれをサポートしていません。

最良の方法は、(floatに変換するINGのtryによって例えば)番号が含まれている場合、各サブストリングをチェックし、それに応じて振る舞う、サブストリングに.split()文字列になるであろう。

追加ボーナス:非常に複雑な正規表現ではなく、読みやすいPythonスクリプトがあります。

関連する問題