2017-01-04 5 views
1

私はこの行のために正規表現を記述しようとしています:グループは、私が試してみましたこの例ではregularexpressionの使用方法は?

単一のグループ(-5.0、-4.0 ...)で記号で浮くことができることを

- 5.0 - 4.0 - 3.0 ... + 12.0

\s*([+](?:\s)*\d*[.])

しかし、どうやらそれはキャプチャグループ内の非キャプチャグループを無視しません。 これがどのように解決できるかについてのご意見はありますか?ここで

+0

問題の詳細については、もっと良い方法があります。入力データは文字列ですか?あなたはどこから入力を得ていますか?別の形式でフォーマットすることができれば、データを扱いやすくなります。また、たくさんのデータ行をテストする本当に簡単な方法が必要な場合は、このサイトに試してみてください。 http://pythex.org/ –

答えて

1

あなたのキャプチャグループには、以下の要素があります。

  • [+]は、空白文字の任意の数の
  • \d*は数字
  • 、任意の数と一致するリテラル +
  • (?:\s)*試合に一致します
  • [.]は、リテラルに一致します.

これは、プラス記号とスペースのあとに数字とそれに続く小数点が続くものです。しかし、 sign-space-digits-decimalpoint-digitのシーケンスを同じ符合にしている限り、行内に一致させたいと思うようです。このような単一のシーケンスと一致する式で

  1. スタート:

    [+-]\s*\d+[.]\d+ 
    

    これはスペース、その後、プラスまたはマイナスに一致するが、その後、数字、小数点、桁私はこのようなことを行うだろう。

  2. パターンを保存して、残りのパターンが同じ記号のシーケンスと一致することを確認します。だからキャプチャグループを作ってください。

    ([+-])\s*\d+[.]\d+ 
    
  3. 今の私たちは、符号が同じであることを確認したいので、我々は後方参照を使用することを除いて、他のグループと一致する(一部の間にスペースを持つ)パターンを繰り返してみましょう。この場合、グループ番号1を捕捉することによりマッチしたものは何でも

    ([+-])\s*\d+[.]\d+\s*\1\s*\d+[.]\d+ 
    

    \1マッチ、すなわち符号、+又は-です。このパターンは、同じ符号を持つ2つの連続するシーケンスと一致します。

  4. パターンの2番目の部分を0個以上の追加シーケンスと一致するように変更します。

    ([+-])\s*\d+[.]\d+(?:\s*\1\s*\d+[.]\d+)* 
    
  5. 最後に、マッチの前と後にスペースを入れることができます。これはsearch関数、またはmatchではなくfindall関数を賢明に使用して解決できます。引数なしのmatch_object.group()を使用して、一致したシーケンスを取得することができます。これは必要なものです。
1

はあなたが試すことができるものです。

(\+|-)\s*(\d+\.\d+)\s* 

ますが、常に末尾のコンマを持つことになりますので、あなたはそれを削除する必要があると思います。あなたの条件によると

Here is a demo

2

グループが使用して単一のグループ(-5.0、-4.0 ...)

溶液中の記号で浮くことができることを

re.findall()機能:

s = '- 5.0 - 4.0 - 3.0 ... + 12.0' 
signed_floats = [re.sub(r'\s+', r'', f) for f in re.findall(r'-\s*\d+\.\d+\b', s)] 

print(signed_floats) 

出力:

['-5.0', '-4.0', '-3.0'] 
関連する問題