2017-07-11 50 views
5

Mam następujący tekstpyton podzielić tekst cytatami i przestrzeni

text = 'This is "a simple" test' 

I muszę podzielić ją na dwa sposoby, pierwszy przez cudzysłów, a następnie przez przestrzenie, w wyniku:

res = ['This', 'is', '"a simple"', 'test'] 

Ale z str.split() używam tylko cudzysłowów lub spacji jako ograniczników. Czy istnieje funkcja wbudowana dla wielu ograniczników?

Odpowiedz

8

Można użyć shlex.split, przydatny do analizowania podane ciągi:

>>> import shlex 
>>> text = 'This is "a simple" test' 
>>> shlex.split(text, posix=False) 
['This', 'is', '"a simple"', 'test'] 

Robi to w nie POSIX-owych trybie uniemożliwia usunięcie wewnętrznych cytatami z wyniku podziału. posix jest ustawiony na True domyślnie:

>>> shlex.split(text) 
['This', 'is', 'a simple', 'test'] 

Jeśli masz wiele wierszy tego rodzaju tekstu lub czytasz ze strumienia, można podzielić skutecznie (bez cudzysłowów w wyjściu) za pomocą csv.reader:

import io 
import csv 

s = io.StringIO(text.decode('utf8')) # in-memory streaming 
f = csv.reader(s, delimiter=' ', quotechar='"') 
print list(f) 
# [['This', 'is', 'a simple', 'test']] 

Jeśli na Python 3, nie trzeba zdekodować ciąg Unicode, ponieważ wszystkie łańcuchy są już unicode.

1

Dla twojego przypadku shlex.split będzie dobrze.

Jako odpowiedź na multiple delimiters?

import re 

re.split('\"|\s', string) 
2

Jeśli rozumiem cię, a następnie można użyć regex

>>> import re 
>>> text = 'This is "a simple" test' 

>>> re.split('\s|\"', text)

[ 'to', 'jest', '', "a", "prosty", "", "test"]

0

przy użyciu czytnika csv.

import csv 
text = 'This is "a simple" test' 
list_text=[] 
list_text.append(text) 
for row in csv.reader(list_text, delimiter=" "): 
    print(row) 

można również dowiedzieć się więcej o here

0

spróbuj Re:

import re 
text = 'This is "a simple" test' 
print(re.split('\"|\s', text)) 

Rezultat:

['This', 'is', '', 'a', 'simple', '', 'test'] 
0

Możesz zajrzeć na shlex bibliotece.

from shlex import split 
a = 'This is "a simple" text' 
split(a) 

[ 'to', 'jest', 'proste', 'tekst']

Nie sądzę regex jest to, czego szukasz