2017-07-05 10 views
2

2つの異なる文字のシーケンスを含む文字列をグループに分割しようとしています。我々は文字がabあると仮定した場合、グループ化のためのプレーンテキストのルールは以下のとおりです。Pythonの正規表現複数のマッチを分割

  • グループは0+ a年代1+ bに続く「次のすべてのa年代の中に含まれているの
  • から成り私たちが言葉の終わりにいない限り、次のグループ。

例:testsを処理した後、目標はexpectedのようなグループに分割することです。

tests = ['abab', 
    'ababab', 
    'aabab', 
    'aababa', 
    'aba', 
    'baba'] 

expected = [['ab','ab'], 
    ['ab','ab','ab'], 
    ['aab','ab'], 
    ['aab','aba'], 
    ['aba'], 
    ['b','aba']] 

私が得ている最も近い以下の通りです:私の正規表現が改善を必要とすることを意味する、1-2のグループにではなく、より大きなグループのためによくない

import re 

# filter() returns iterator not list in Python 3 
def testing(s): 
    return list(filter(None, re.compile('(a*b+a*(?=$))').split(s))) 

output = [testing(s) for s in tests] 

output 

[['ab', 'ab'], ['abab', 'ab'], ['aab', 'ab'], ['aab', 'aba'], ['aba']] 

。私はアプローチを再考すべきでしょうか?私はおそらくループのために何かを強引にすることができますが、よりエレガントなものを望んでいました。

N.B .: This post .split()はここに行く方法ではないかもしれませんが、これまでのところ最良の結果が得られました。

答えて

2

私はあなたが正しい軌道にいると信じています。しかし、あなたの正規表現はあなたが考えるより多くのバグを持っています。あなたのテストケースは考えられるすべてのシナリオをカバーしているわけではないので、あなたはこれを理解していません。

特別なケースが2つあるので、別々に扱う必要があります。たとえば、最後の入力はabaと一致するため特殊なケースです。同様に、他のものを別々に挙げて、|と一緒に参加させてください。 re.findallも使用できます。清潔です。

tests = ['abab', 
     'ababab', 
     'aabab', 
     'aababa', 
     'aba', 
     'baba'] 

def testing(s): 
    return re.findall('(?:a*b+a+$)|(?:a*b+)|(?:b+a+)', s) 

output = [testing(s) for s in tests] 
print(output) 

出力:

tests = ['abab', 
'ababab', 
'aabab', 
'aababa', 
'aba', 
'baba', 
'abba'] 

for s in tests: 
    r = re.findall("(?:a*b+a*$)|(?:a*b+)",s) 
    print(r) 

結果::これは私に正しいテストデータの結果得られ

[['ab', 'ab'], ['ab', 'ab', 'ab'], ['aab', 'ab'], ['aab', 'aba'], ['aba'], ['b', 'aba']] 
+0

この答えは私の元のテストケースのために働くのと説明は非常に便利ですが、それはうまくいきません0の 'a'で始まる文字列がある場合です。 試験( 'BAB') 収率 '[ 'BAB']' 'の代わりに[ 'B'、 'AB']' のIは、散文ケースを反映するためにテストケースを編集しました。 – Eric

+0

@Eric私の悪い、私はその要件を見ていない。私はそれを修正し、今は動作します。私はまだ、この正規表現がすべての特別な場合を明示的に処理するため、あなたが受け入れた正規表現より優れていると思います。あなたが使うものを再考してください。 –

+0

私はあなたの説明に感謝し、あなたの回答形式を私の質問と一致させることに感謝します。 – Eric

1

['ab', 'ab'] 
['ab', 'ab', 'ab'] 
['aab', 'ab'] 
['aab', 'aba'] 
['aba'] 
['b', 'aba'] 
['abba']