2017-12-21 4 views
2

Das POS-Tagger verwenden, die ich Prozesse verwenden Sie die folgende ZeichenfolgePython: Split String regex

3+2 

wie unten gezeigt.

3/num++/sign+2/num 

Ich möchte dieses Ergebnis wie folgt mit Python teilen.

['3/num', '+/sign', '2/num']   

Wie kann ich das tun?

+1

Können Sie uns zeigen Sie Ihren Code? Was hast du bisher versucht ? Wo geht es schief? ... Vielen Dank. –

Antwort

3

Verwendung re.split -

>>> import re 
>>> re.split(r'(?<!\+)\+', '3/num++/sign+2/num') 
['3/num', '+/sign', '2/num'] 

Die RegexMuster geteilt wird auf einem + Zeichen, solange kein anderes + vorausgeht.

(?<! # negative lookbehind 
\+  # plus sign 
)  
\+  # plus sign 

Beachten Sie, dass Lookbehinds (im Allgemeinen) keine unterschiedlichen Längenmuster unterstützen.

+0

Es scheint, dass einige Downvoter denken wollen, ich würde Ihre Lösungen ablehnen. Aber er liegt falsch;) Weil unsere Zustimmung;) – jezrael

+1

Wenn die Antwort hilfreich war, nicht vergessen [accept] (https://stackoverflow.com/help/someone-answers) es - klicken Sie auf das Häkchen ('✓') neben der Antwort, um es von ausgegraut zu gefüllt zu schalten. Danke. – jezrael

+1

@jezrael Danke, und viel Glück für Sie! :-) –

1

Der schwierige Teil glaube ich ist das doppelte + Zeichen. Sie können die Zeichen durch Sonderzeichen ersetzen und erledigen.

Dies sollte, arbeiten

st = '3/num++/sign+2/num' 

st = st.replace('++', '@$') 
st = st.replace('+', '@') 
st = st.replace('$', '+') 

print (st.split('@')) 

Ein Problem dabei ist, dass, Ihre ursprüngliche Zeichenfolge nicht diese Sonderzeichen @ & $ enthalten. Sie müssen sie also sorgfältig für Ihren Anwendungsfall auswählen.

Bearbeiten: Diese Antwort ist naiv. Der mit regex ist besser Das heißt, wie durch COLDSPEED wies darauf hin, sollten Sie die folgenden regex Ansatz mit Lookbehind verwenden,

import re 
print re.split(r'(?<!\+)\+', '3/num++/sign+2/num') 
+0

Dies ist extrem langwierig und umständlich, ganz zu schweigen von der Gefahr mit einem willkürlich gewählten Zeichen als Trennzeichen. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ stimme ich zu. Ihre Antwort ist besser –

+0

@PubuduDodangoda Danke für die Antwort! – Bryan

0

Obwohl die frage war Regex zu verwenden, hier ist ein Beispiel dafür, wie diese .split() mit Standard zu tun:

my_string = '3/num++/sign+2/num' 

my_list = [] 
result = [] 

# enumerate over the split string 
for e in my_string.split('/'): 
    if '+' in e: 
     if '++' in e: 
      #split element on double + and add in + as well 
      my_list.append(e.split('++')[0]) 
      my_list.append('+') 
     else: 
      #split element on single + 
      my_list.extend(e.split('+')) 
    else: 
     #add element 
     my_list.append(e) 

# at this point my_list contains 
# ['3', 'num', '+', 'sign', '2', 'num'] 

# enumerate on the list, steps of 2 
for i in range(0, len(my_list), 2): 
    #add result 
    result.append(my_list[i] + '/' + my_list[i+1]) 

print('result', result) 

# result returns 
# ['3/num', '+/sign', '2/num']