2017-03-23 3 views
1

私が作成したアプリケーションの文字列を解析しようとしています。 アスタリスクが続き、特定の単語が最初に出現しなかった場合にのみカンマで区切りたいと思います。「CONDITION」としましょう。 !Example,Value,1,*SPLIT_THIS=True,*AND_THIS=True,*CONDITION=Something/ELSE:!Example,Value,2,*DONT_SPLIT=True,*AND_NOT_THIS=True,*CONDITION=SomethingElse/ELSE:False特定の単語までカスタムデリミタで正規表現を分割する文字列

は以下のように分割する必要があります。例:文字列のためにそう、だから、

["!Example,Value,1", "*SPLIT_THIS=True", "*AND_THIS=True", "*CONDITION=Something/ELSE:!Example,Value,2,*DONT_SPLIT=True,*AND_NOT_THIS=True,*CONDITION=SomethingElse/ELSE:False"]

、より多くの「CONDITION」の存在で、よりコンマアスタリスクがあるかもしれませんが、私は唯一まで分割したいです"CONDITION"の最初の出現。私は(?=(CONDITION))または(?=CONDITION)のような肯定的な先読みを、アスタリスク(アスタリスクを含まず)の後にコンマで区切るには',\*'としましたが、正しいものを見つけることができません。どんなポインタも非常に役に立ちます。

+0

あなたはこれを達成するために単一の正規表現を使用することはできないと私は考えていません。 –

+1

https://ideone.com/rLvOsPにチェックを入れ、問題がないかどうかをお知らせください。 –

+0

ほぼ完成!文字列の最後の部分(2番目のCONDITION部分)はアスタリスクで始まらなければなりませんが、この例ではありません。迅速な返答をありがとう、私はそれが単一の式で動作させることができると思って頑固になっていたが、明らかにそれは不可能です。最初の分割はそのトリックをうまくやっています。 – Dima1982

答えて

1

正規表現の解法が1つではないので、ここで具体的なロジックを適用する必要があります(現在の場所の左にCONDITIONがあるかどうかを調べるには無限の幅の照合が必要です。PyPi正規表現モジュールのみ)。ここで

が可能なソリューションです:

import re 
s = '!Example,Value,1,*SPLIT_THIS=True,*AND_THIS=True,*CONDITION=Something/ELSE:!Example,Value,2,*DONT_SPLIT=True,*AND_NOT_THIS=True,*CONDITION=SomethingElse/ELSE:False' 
x = re.search(r"\*(CONDITION|MOREOPTIONS)", s) 
res = [] 
if x: 
    res = re.findall(r"(?:^|\*)[^*]+(?=,|$)", s[:x.start(1)]) 
    res.append(s[x.start(1):]) 

print(res) 
# => ['!Example,Value,1', '*SPLIT_THIS=True', '*AND_THIS=True', 
    'CONDITION=Something/ELSE:!Example,Value,2,*DONT_SPLIT=True,*AND_NOT_THIS=True,*CONDITION=SomethingElse/ELSE:False'] 

online Python demo

詳細参照してください:

  • re.search(r"\*(CONDITION|MOREOPTIONS)", s)を - CONDITION(さらに追加| -seapratedオプションの最初の発生を見つけます必要に応じて)
  • re.findall(r"(?:^|\*)[^*]+(?=,|$)", s[:x.start(1)]) - 一致がある場合、一致しCONDITION前に、文字列内のすべての非重複出現見つける: - 文字列の先頭または*
  • [^*]+から*
  • 以外の1以上の文字
    • (?:^|\*)
    • (?=,|$) - 彼らに
  • res.append(s[x.start(1):])を消費することなく,または文字列の末尾を要求 - CONDITION以降の部分を追加するだけです。
+1

超高速応答、明確な説明、無限の幅の見通しへのポインタありがとう!私はそれについていくつかのフォローアップの読書をします。 – Dima1982

+1

PyPi 'regex.split' - ['(?<!、\ * CONDITION =。*?)、(?= \ *) '](http://regexstorm.net/)で使用できる正規表現はありますか?テスター?p =%28%3f%3c!%2c%5c *条件3d。*%3f%29%2c%28%3f%3d%5c *%29&i =!例%2cValue%2c1%2c * SPLIT_THIS%3dTrue%2c * AND_THIS%3dTrue%2c *条件3dSomething%2fELSE%3a!例%2cValue%2c2%2c * DONT_SPLIT%3dTrue%2c * AND_NOT_THIS%3dTrue%2c * CONDITION% 3dSomethingElse%2fELSE%3aFalse)。しかし、PyPiが.NET正規表現エンジンとして安定しているかどうかはわかりません。 –

+0

代替ソリューションをもう一度ありがとう!これはプロダクションサーバーに格納されますので、提供したソリューションは堅実です!私はPyPiで実験します! :) – Dima1982

関連する問題