2017-02-08 19 views
17

mam listy ciągów z separatorami A i B:wyodrębnić tekst z wieloma separatorami

L = ['sgfgfqds A aaa','sderas B ffff','eeee','sdsdfd A rrr'] 

i potrzeby:

L1 = [['aaa'], ['ffff'], ['eeee'], ['rrr']] 

Próbowałem za pomocą:

L1 = [re.findall(r'(?<=A)(.*)$', inputtext) for inputtext in L] 
print (L1) 

ale go zwraca następujące wartości:

[[' aaa'], [], [], [' rrr']] 

Jak uzyskać żądany wynik?

Odpowiedz

21

Można użyć re.split złamać swoje struny po obu 'A' lub 'B':

>>> L1 = [re.split(r'[AB] *', inputtext)[-1] for inputtext in L] 
>>> L1 
['aaa', 'ffff', 'eeee', 'rrr'] 
+1

cholera miałem 'LL = [re.split ("[AB]", x) [- 1] .strip() for x in L]' :) –

+5

myślę, że jeśli masz 'A' i 'B' zawsze zamknięty z białymi znakami, lepiej użyj' r '+ [AB] +' '(lub' r '\ s + [AB] \ s +' '). –

6

Propozycja alternatywna bez regex.

[[i] for i in ' '.join(L).split(' ') if i.count(i[0]) == len(i) and len(i) > 1] 

Wynik

[['aaa'], ['ffff'], ['eeee'], ['rrr']] 
2

Jeśli chcesz to do pracy z więcej niż tylko A lub B, możesz użyć

>>> L = ['sgfgfqds A aaa','sderas B ffff','eeee','sdsdfd A rrr', 'lasjd X gggggg'] 
>>> L1 = [re.split(r'[A-Z] *', inputtext)[-1] for inputtext in L] 
>>> print(L1) 
['aaa', 'ffff', 'eeee', 'rrr', 'gggggg'] 
1
for a in L: 
    if 'A' in a or 'B' in a: 
     clist = a.split() 
     for c in clist: 
      if c[::-1] == c: 
       if c == 'A' or c == 'B': 
        pass 
       else: 
        #print "c1",c 
        result.append([c]) 
      else: 
       pass 
    else: 
     result.append([a]) 

    print result 
6

Możesz użyć faktu, że split zwraca listę, nawet jeśli nie znajduje separatora.

L1 = [[x.split(' A ')[-1].split(' B ')[-1]] for x in L] 
Powiązane problemy