J'essaie de supprimer des caractères spécifiques d'une chaîne à l'aide de Python. C'est le code que j'utilise en ce moment. Malheureusement, il semble ne rien faire à la chaîne.
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
Comment dois-je procéder correctement?
python
string
immutability
Matt Phillips
la source
la source
filter
fonction et une expression Lambda:filter(lambda ch: ch not in " ?.!/;:", line)
. Assez concis et efficace aussi, je pense. Bien sûr, il renvoie une nouvelle chaîne à laquelle vous devrez attribuer un nom.Réponses:
Les chaînes en Python sont immuables (ne peuvent pas être modifiées). Pour cette raison, l'effet de
line.replace(...)
est simplement de créer une nouvelle chaîne, plutôt que de changer l'ancienne. Vous devez la relier (l'assigner)line
pour que cette variable prenne la nouvelle valeur, avec ces caractères supprimés.De plus, la façon dont vous le faites va être relativement lente. Cela risque également d'être un peu déroutant pour les pythonateurs expérimentés, qui verront une structure doublement imbriquée et penseront un instant que quelque chose de plus compliqué se passe.
À partir de Python 2.6 et des versions plus récentes de Python 2.x *, vous pouvez utiliser à la place
str.translate
, (mais lisez la suite pour les différences Python 3):ou remplacement d'expression régulière par
re.sub
Les caractères entre crochets constituent une classe de caractères . Tous les caractères dans
line
lesquels se trouvent dans cette classe sont remplacés par le deuxième paramètre poursub
: une chaîne vide.En Python 3, les chaînes sont Unicode. Vous devrez traduire un peu différemment. kevpie le mentionne dans un commentaire sur l'une des réponses, et c'est noté dans la documentation de
str.translate
.Lors de l'appel de la
translate
méthode d'une chaîne Unicode, vous ne pouvez pas passer le deuxième paramètre que nous avons utilisé ci-dessus. Vous ne pouvez pas non plus passerNone
comme premier paramètre. Au lieu de cela, vous passez une table de traduction (généralement un dictionnaire) comme seul paramètre. Ce tableau mappe les valeurs ordinales des caractères (c'est-à-dire le résultat de leur appelord
) aux valeurs ordinales des caractères qui devraient les remplacer, ou - utilement pour nous -None
pour indiquer qu'ils doivent être supprimés.Donc, pour faire la danse ci-dessus avec une chaîne Unicode, vous appelleriez quelque chose comme
Ici
dict.fromkeys
etmap
sont utilisés pour générer succinctement un dictionnaire contenantEncore plus simple, comme le dit une autre réponse , créez la table de traduction en place:
Ou créez la même table de traduction avec
str.maketrans
:* pour la compatibilité avec les Pythons antérieurs, vous pouvez créer une table de traduction "null" à passer à la place de
None
:Ici
string.maketrans
est utilisé pour créer une table de traduction , qui est juste une chaîne contenant les caractères avec des valeurs ordinales de 0 à 255.la source
line.translate
ne prend qu'un seul argument et la première solution ne fonctionnera pasline.translate({ord(i):None for i in '!@#$'})
"'"
pour le jeu de caractères.notes = notes.translate({ord(i):None for i in '\"\''})
unicode_line.translate(str.maketrans('', '', '!@#$'))
. Ouunicode_line.translate(dict.fromkeys(map(ord, '!@#$')))
Est-ce que je manque le point ici, ou est-ce juste le suivant:
Mettez-le en boucle:
la source
for char in b: a=a.replace(char,"")
string=string.replace("1","")
place. Vous avez en quelque sorte dit cela dans la partie en boucle de votre exemple, mais la plupart des gens ne liront pas aussi loin dans votre réponse qu'après avoir manipulé le code un peu en premier pour une question aussi simple.la source
blacklist = set('?:!/;')
puis''.join(c for c in line if c not in blacklist)
Peasy facile avec
re.sub
expression régulière à partir de Python 3.5Exemple
Explication
Dans les expressions régulières (regex),
|
est un OU logique et\
échappe les espaces et les caractères spéciaux qui peuvent être des commandes regex réelles. Alors quesub
signifie substitution, dans ce cas avec la chaîne vide''
.la source
Pour l'exigence inverse d' autoriser uniquement certains caractères dans une chaîne, vous pouvez utiliser des expressions régulières avec un opérateur complément complément
[^ABCabc]
. Par exemple, pour supprimer tout sauf les lettres ascii, les chiffres et le tiret:Dans la documentation des expressions régulières python :
la source
Le demandeur l'a presque eu. Comme la plupart des choses en Python, la réponse est plus simple que vous ne le pensez.
Vous n'avez pas à faire la boucle imbriquée if / for, mais vous devez vérifier chaque caractère individuellement.
la source
la source
la source
Les chaînes sont immuables en Python. La
replace
méthode renvoie une nouvelle chaîne après le remplacement. Essayer:la source
line
.J'ai été surpris que personne n'ait encore recommandé d'utiliser la fonction de filtre intégré .
Disons que nous voulons filtrer tout ce qui n'est pas un nombre. L'utilisation de la méthode de filtrage intégrée "... est équivalente à l'expression du générateur (élément pour élément dans la fonction itérable si élément (élément))" [ Python 3 Builtins: Filter ]
En Python 3, cela renvoie
Pour obtenir une chaîne imprimée,
Je ne sais pas comment le filtre se classe en termes d'efficacité, mais c'est une bonne chose de savoir comment l'utiliser lors de la compréhension de listes et autres.
MISE À JOUR
Logiquement, puisque le filtre fonctionne, vous pouvez également utiliser la compréhension de liste et d'après ce que j'ai lu, il est censé être plus efficace car les lambdas sont les gestionnaires de fonds spéculatifs de Wall Street du monde de la fonction de programmation. Un autre avantage est qu'il s'agit d'un monoplace qui ne nécessite aucune importation. Par exemple, en utilisant la même chaîne «s» définie ci-dessus,
C'est ça. Le retour sera une chaîne de tous les caractères qui sont des chiffres de la chaîne d'origine.
Si vous avez une liste spécifique de caractères acceptables / inacceptables, il vous suffit d'ajuster la partie «si» de la compréhension de la liste.
Ou bien,
la source
operator.contains
si vous utilisez delambda
toute façon un .lambda x: operator.contains(intsList, x)
devrait être orthographiélambda x: x in intsList
, ou si vous essayez d'obtenir le contrôle de niveau C,intsList.__contains__
(paslambda
du tout) fera l'affaire.À l'aide
filter
, vous auriez juste besoin d'une ligneCela traite la chaîne comme un itérable et vérifie chaque caractère si le
lambda
retourneTrue
:la source
Voici quelques façons possibles d'accomplir cette tâche:
PS: Au lieu d'utiliser "?.! /;:" Les exemples utilisent les voyelles ... et oui, "murcielago" est le mot espagnol pour dire bat ... mot drôle car il contient toutes les voyelles :)
PS2: Si vous êtes intéressé par les performances, vous pouvez mesurer ces tentatives avec un code simple comme:
Dans ma boîte, vous obtiendrez:
Il semble donc que try4 soit le plus rapide pour cette entrée particulière.
la source
list
in inutileattempt1
et le tuple peut être réécrit pour"aeiou"
des raisons de simplicité (le supprimer[
et]
le transformer en générateur sans créer de liste). Vous créez des tonnes de chaînes intermédiaires jetables dansattemt2
, vous utilisez plusieurs applications de regexattempt3
où vous pouvez les utiliserr'[aeiou]'
en une seule passe. chacun a des défauts - c'est agréable de voir différentes façons de faire les choses, mais corrigez-les aussi pour être de bonnes tentativesVoici ma version compatible Python 2/3. Depuis l'api de traduction a changé.
la source
dict.fromkeys(map(ord, '!@#$'))
pour créer la carte.map
est généralement moins lisible qu'une compréhension de liste / dict / set / générateur. À tel point que Guido a voulu le supprimer de la langue . L'utilisationfromkeys
est également un peu intelligente et nécessite une vérification de la documentation.str.maketrans('', '', chars)
, qui gère laord
conversion et ladict
construction en une seule fois (sans parler d'être plutôt plus évident dans son intention, car il est conçu pour être couplé avecstr.translate
).la source
'
comme une chaîne. docs.python.org/2/library/re.htmlQue dis-tu de ça:
la source
Vous pouvez également utiliser une fonction afin de remplacer différents types d'expressions régulières ou d'autres modèles par l'utilisation d'une liste. Avec cela, vous pouvez mélanger expression régulière, classe de caractères et modèle de texte vraiment basique. C'est vraiment utile lorsque vous devez remplacer de nombreux éléments comme ceux HTML.
* NB: fonctionne avec Python 3.x
Dans la fonction string_cleanup, il prend votre chaîne x et votre liste non souhaitées comme arguments. Pour chaque élément de cette liste d'éléments ou de motif, si un substitut est nécessaire, il sera effectué.
Le résultat:
la source
Ma méthode que j'utiliserais ne fonctionnerait probablement pas aussi efficacement, mais elle est extrêmement simple. Je peux supprimer plusieurs caractères à différentes positions à la fois, en utilisant le découpage et le formatage. Voici un exemple:
Cela se traduira par «supprimé» contenant le mot «ceci».
Le formatage peut être très utile pour imprimer des variables au milieu d'une chaîne d'impression. Il peut insérer n'importe quel type de données en utilisant un % suivi du type de données de la variable; tous les types de données peuvent utiliser % s , et les flottants (aussi appelés décimales) et les entiers peuvent utiliser % d .
Le découpage peut être utilisé pour un contrôle complexe des chaînes. Lorsque je mets des mots [: 3] , cela me permet de sélectionner tous les caractères de la chaîne depuis le début (les deux-points sont avant le nombre, cela signifie «du début à») jusqu'au 4ème caractère (il inclut le 4ème personnage). La raison pour laquelle 3 est égal jusqu'à la 4ème position est parce que Python commence à 0. Ensuite, quand je mets le mot [-1:] , cela signifie le 2ème dernier caractère à la fin (les deux-points sont derrière le nombre). Mettre -1 fera compter Python à partir du dernier caractère, plutôt que du premier. Encore une fois, Python commencera à 0. Donc, le mot [-1:] signifie essentiellement "de l'avant-dernier caractère à la fin de la chaîne.
Donc, en coupant les caractères avant le caractère que je veux supprimer et les caractères après et en les prenant en sandwich, je peux supprimer le caractère indésirable. Pensez-y comme une saucisse.Au milieu, c'est sale, donc je veux m'en débarrasser. Je coupe simplement les deux extrémités que je veux puis les assemble sans la partie indésirable au milieu.
Si je veux supprimer plusieurs caractères consécutifs, je déplace simplement les nombres dans [] (partie de découpage). Ou si je veux supprimer plusieurs caractères de différentes positions, je peux simplement prendre en sandwich plusieurs tranches à la fois.
Exemples:
supprimé est égal à «cool».
supprimé est égal à «macs».
Dans ce cas, [3: 5] signifie caractère en position 3 à caractère en position 5 (à l'exclusion du caractère en position finale).
N'oubliez pas que Python commence à compter à 0 , vous devrez donc également le faire.
la source
Essaye celui-là:
Cette méthode fonctionne bien en python 3.5.2
la source
Vous pouvez utiliser le remplacement d'expression régulière du module re. L'utilisation de l'expression ^ vous permet de choisir exactement ce que vous voulez dans votre chaîne.
La sortie de ceci serait "Thisisabsurd". Seules les choses spécifiées après le symbole ^ apparaîtront.
la source
La méthode chaîne
replace
ne modifie pas la chaîne d'origine. Il laisse l'original seul et renvoie une copie modifiée.Ce que vous voulez, c'est quelque chose comme:
line = line.replace(char,'')
Cependant, créer une nouvelle chaîne à chaque fois qu'un caractère est supprimé est très inefficace. Je recommande plutôt ce qui suit:
la source
Ci-dessous un .. sans utiliser le concept d'expression régulière ..
la source
En Python 3.5
par exemple,
Pour supprimer tout le nombre de la chaîne
la source
vous pouvez utiliser set
la source
Fractionnement récursif: s = chaîne; chars = caractères à supprimer
exemple:
la source
# pour chaque fichier d'un répertoire, renommez le nom de fichier
la source
Même l'approche ci-dessous fonctionne
production:
abcde
la source
la source