2017-05-04 2 views
2

私はPython文字列セパレータの後ろに特定のパターンがない限り、セパレータで文字列を分割するにはどうすればよいですか?

string = aaa1bbb1ccc1ddd 

持っていると私は結果は私がこれを行うにはどうすればよい

['aaa', 'bbb1ccc', 'ddd'] 

され、その結果、この

re.split('[split at all occurrences of "1", unless the 1 is followed by a c]', string) 

のようにそれを分割したいですか?

+4

は否定先読みアサーションを使用します。 –

+1

're.split ( '1') 'かつ一度' p1'を処理する)、メモリーフットプリントを2倍にします。正規表現はこれを行うもっと良い方法です。 – ozgur

答えて

8
正規表現と reモジュールと

使用負の先読み:

>>> string = 'aaa1bbb1ccc1ddd' 
>>> import re 
>>> re.split(r"1(?!c)", string) 
['aaa', 'bbb1ccc', 'ddd'] 
3
def split_by_delim_except(s, delim, bar): 
    escape = '\b' 
    find = delim + bar 
    return map(lambda s: s.replace(escape, find), 
       s.replace(find, escape).split(delim)) 

split_by_delim_except('aaa1bbb1ccc1ddd', '1', 'c') 
0

正規表現のようにきれいな、私の次のコードは、同じ結果を返しませんが:

string = 'aaa1bbb1ccc1ddd' 

は、文字列を分割'1'のすべての場合で

p1 = string.split('1') 

ので、我々は

new_result = [] 

count = 0 
for j in p1: 

    if j.startswith('c'): 

     # This removes the previous element from the list and stores it in a variable. 
     prev_element = new_result.pop(count-1) 

     prev_one_plus_j = prev_element + '1' + j 

     new_result.append(prev_one_plus_j) 

    else: 
     new_result.append(j) 

    count += 1 

print (new_result) 

出力に私たちの希望の項目を追加することができ、新たな空のリストを作成します:

[ 'AAA'、 'bbb1ccc'、 'DDD']

+0

これは、イテレータを2回トラバースします(一度 'string.split()を実行すると、1(?!c)' *(1の後にcが付きます)* –

+0

ありがとう@MatthewCole、それはたくさんの意味があります。正規表現をうまく学ぶことは本当に便利です! –

関連する問題