2つの異なる文字のシーケンスを含む文字列をグループに分割しようとしています。我々は文字がa
とb
あると仮定した場合、グループ化のためのプレーンテキストのルールは以下のとおりです。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()はここに行く方法ではないかもしれませんが、これまでのところ最良の結果が得られました。
この答えは私の元のテストケースのために働くのと説明は非常に便利ですが、それはうまくいきません0の 'a'で始まる文字列がある場合です。 試験( 'BAB') 収率 '[ 'BAB']' 'の代わりに[ 'B'、 'AB']' のIは、散文ケースを反映するためにテストケースを編集しました。 – Eric
@Eric私の悪い、私はその要件を見ていない。私はそれを修正し、今は動作します。私はまだ、この正規表現がすべての特別な場合を明示的に処理するため、あなたが受け入れた正規表現より優れていると思います。あなたが使うものを再考してください。 –
私はあなたの説明に感謝し、あなたの回答形式を私の質問と一致させることに感謝します。 – Eric