8
votes

effondrement des espaces dans une chaîne

J'ai une chaîne qui ressemble à ceci:

def normalize(string):
    import re

    string = string.upper()

    rex   = re.compile(r'\W')
    rex_s = re.compile(r'\s{2,}')

    result = rex.sub(' ', string) # this produces a string with tons of whitespace padding
    result = rex.sub('', result) # this reduces all those spaces

    return result


0 commentaires

6 Réponses :


3
votes
result = rex.sub(' ', string) # this produces a string with tons of whitespace padding
result = rex_s.sub(' ', result) # this reduces all those spaces

2 commentaires

bonne prise sur la partie de type. Je viens de remarquer que des moments après avoir posté. Vous m'avez battu avant que j'ai eu la chance d'éditer OMG


Je suggérerais de jeter un coup d'œil au code d'Alex - c'est une méthode beaucoup plus concise d'aborder le problème, et elle gère également la ponctuation / l'espace blanche à la fin de la corde.



18
votes

Voici une approche en une étape (mais la majuscule utilise réellement une méthode de chaîne - beaucoup plus simple!): xxx

où strarg est l'argument de chaîne ( NE PAS Noms Utilisez des noms que des modules de construction ou de bibliothèque standard, s'il vous plaît ).


3 commentaires

Je conviens que cela serait certainement le moyen plus simple d'aborder le problème.


Je suppose que cela devrait être "String" et non "Résultat" dans l'argument de Rex.Sub? Ou est-ce que cela ne remplace que la partie du code de l'utilisateur?


@Brooks, tu as raison - je suis tellement opposé à l'observation des noms intégrés et des noms de module standard, que tout sauf String a volé sur mes doigts. Laissez-moi éditer pour réparer et merci!



1
votes

Devez-vous utiliser des expressions régulières? Vous sentez-vous que vous devez le faire dans une ligne?

>>> import string
>>> s = "stuff   .  // : /// more-stuff .. .. ...$%$% stuff -> DD"
>>> s2 = ''.join(c for c in s if c in string.letters + ' ')
>>> ' '.join(s2.split())
'stuff morestuff stuff DD'


0 commentaires

5
votes
re.sub(r'[_\W]+', ' ', s).strip().upper()
# 'AA1BB2 CC DD EE FF GGG'

1 commentaires

+1 pour contourner le re.cile (...) étape. Si je pouvais, je vous donnerais un autre +1 pour souligner également la question de savoir comment gérer «_» et leader / traînant WS, car ces choses sont souvent négligées avec une regex.



1
votes

fonctionne dans Python3 Ceci conservera le même caractère d'espaces que vous avez effondré. Donc, si vous avez un onglet et un espace côte à côté de l'autre, ils ne s'effondreront pas dans un seul caractère.

re.sub('\W+', ' ', orig).upper()


0 commentaires

0
votes

On peut utiliser une expression régulière pour substituer des espaces blancs récurrents. L'espace blanc est donné par \ s code> avec \ s + code> Signification: au moins un.

import re
rex = re.compile(r'\s+')
test = "     x  y z           z"
res = rex.sub(' ', test)
print(f">{res}<")


0 commentaires