web-dev-qa-db-fra.com

Formatage en chaîne de caractères en python 3

J'essaie de formater cette chaîne ci-dessous où une ligne contient cinq mots. Cependant, je continue à avoir ceci comme sortie:

J aime les biscuits oui je vois un chien

Premièrement, je ne reçois pas 5 mots sur une ligne, mais tout sur une ligne. 

Deuxièmement, pourquoi le "Let's" est-il divisé? Je pensais qu'en scindant la chaîne en utilisant des "mots", il ne se séparerait que s'il y avait un espace entre les deux? 

Suggestions? 

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)
10
Student J

Pour commencer, n'appelez pas une variable "chaîne" car elle masque le module avec le même nom

Deuxièmement, utilisez split() pour fractionner vos mots

>>> 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.']

De re-module

\ W Correspond à tout caractère qui n'est pas un caractère Word Unicode. C'est l'opposé de\w. Si le drapeau ASCII est utilisé, il devient l’équivalent de [^ a-zA-Z0-9_] (mais ce drapeau affecte toute l’expression régulière. Ainsi, dans ce cas, vous utilisez un [^ a-zA-Z0- 9_] peut être un meilleur choix).

Puisque le ' ne figure pas dans la liste ci-dessus, l’expression rationnelle utilisée divise la chaîne "Let's" en deux parties:

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

Voici le résultat obtenu en utilisant la méthode strip () - ci-dessus:

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

Le code pourrait probablement être simplifié à ceci depuis counter==0 et la clause else fait la même chose. Je passe dans un énumérer là aussi pour me débarrasser du compteur:

#!/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)
20
Fredrik Pihl
words = string.split()
while (len(words))
     for Word in words[:5]
          print(Word, end=" ")
     print()
     words = words[5:]

C'est le concept de base, divisez-le en utilisant la méthode split ()

Puis coupez-le en utilisant la notation slice pour obtenir les 5 premiers mots.

Puis coupez les 5 premiers mots, et bouclez à nouveau

1
Stephan