2013-06-20 28 views
8

Sto provando a formattare questa stringa sotto la quale una riga contiene cinque parole. Tuttavia, continuo a ricevere questo come l'output:Formattazione split delle stringhe in python 3

amo i biscotti sì Cosa mi lasciate s vedere un cane

In primo luogo, io non sono sempre 5 parole in una sola riga, ma, invece, tutto in una linea.

In secondo luogo, perché il "Let's" viene diviso? Ho pensato di dividere la stringa usando "words", sarà divisa solo se ci fosse uno spazio in mezzo?

Suggerimenti?

string = """I love cookies. yes I do. Let's see a dog.""" 


# split string 
words = re.split('\W+',string) 

words = [i for i in words if i != ''] 


counter = 0 
output='' 
for i in words: 
    if counter == 0: 
     output +="{0:>15s}".format(i) 

# if counter == 5, new row 
    elif counter % 5 == 0: 
     output += '\n' 
     output += "{0:>15s}".format(i) 

    else: 
     output += "{0:>15s}".format(i) 

    # Increase the counter by 1 
    counter += 1 

print(output) 
+0

Ho dimenticato di copiare quello qui. L'ho appena fatto. –

+0

Grazie! Questo post ha più senso ora. –

risposta

17

Per cominciare, non chiamare una "stringa" variabile dal momento che ombre della module con lo stesso nome

In secondo luogo, utilizzare split() per fare la tua parola-splitting

>>> s = """I love cookies. yes I do. Let's see a dog.""" 
>>> s.split() 
['I', 'love', 'cookies.', 'yes', 'I', 'do.', "Let's", 'see', 'a', 'dog.'] 

Da re-module

\ W Corrisponde a qualsiasi carattere che non sia un carattere di parola Unicode. Questo è l'opposto di \ w. Se viene usato il flag ASCII questo diventa l'equivalente di [^ a-zA-Z0-9_] (ma il flag influenza l'intera espressione regolare, quindi in tali casi l'uso di un esplicito [^ a-zA-Z0-9_] potrebbe essere una scelta migliore).

Poiché il ' non è elencato in precedenza, la regexp utilizzato divide il "Facciamo" stringa in due parti:

>>> words = re.split('\W+', s) 
>>> words 
['I', 'love', 'cookies', 'yes', 'I', 'do', 'Let', 's', 'see', 'a', 'dog', ''] 

Questa è l'uscita ottengo utilizzando la striscia () -approach sopra:

$ ./sp3.py 
       I   love  cookies.   yes    I 
      do.   Let's   see    a   dog. 

il codice potrebbe probabilmente essere semplificata a questo dato counter==0 e la else-clause fa la stessa cosa. I attraverso in un enumerate lì anche per sbarazzarsi del contatore:

#!/usr/bin/env python3 

s = """I love cookies. yes I do. Let's see a dog.""" 
words = s.split() 

output = '' 
for n, i in enumerate(words): 
    if n % 5 == 0: 
     output += '\n' 
    output += "{0:>15s}".format(i) 
print(output) 
+0

Ulteriori informazioni sul motivo per cui non verrà formattato con una 5 parole per riga? Grazie –

+0

@ user1631819 - guarda la mia uscita, mi sembra a posto. Sei d'accordo? –

+0

@fredrickpihl Intendi a words.strip() prima del ciclo? –

1
words = string.split() 
while (len(words)) 
    for word in words[:5] 
      print(word, end=" ") 
    print() 
    words = words[5:] 

Questo è il concetto di base, divisi utilizzando il metodo split()

Poi fetta usando fetta notazione per ottenere le prime 5 parole

Quindi tagliare le prime 5 parole e ripetere il ciclo

+0

split(), beh, si divide su spazi vuoti per default, non c'è bisogno della parte '(" ") –

+0

oops grazie editato – Stephan

+0

@stephan Ho provato il tuo suggerimento, come ho fatto io:' while i

Problemi correlati