Les caractères que python considère comme des espaces sont stockés dans string.whitespace.
John Fouhy
2
Par «fonction de bande», vous voulez dire la méthode de bande? "cela ne semble pas fonctionner pour mon entrée" Veuillez fournir votre code, votre entrée et la sortie.
Comme le souligne thedz , vous pouvez fournir un argument pour supprimer des caractères arbitraires à l'une de ces fonctions comme ceci:
s = s.strip(' \t\n\r')
Cela bande d'espace, \t, \n, ou \rcaractères à partir du côté gauche, à droite ou des deux côtés de la chaîne.
Les exemples ci-dessus suppriment uniquement les chaînes des côtés gauche et droit des chaînes. Si vous souhaitez également supprimer des caractères au milieu d'une chaîne, essayez re.sub:
Le dernier exemple est exactement comme l'utilisation str.replace(" ",""). Vous n'avez pas besoin d'utiliser re, sauf si vous avez plus d'un espace, alors votre exemple ne fonctionne pas. []est conçu pour marquer des caractères uniques, il n'est pas nécessaire si vous utilisez uniquement \s. Utilisez soit \s+ou [\s]+(inutile) mais [\s+]ne fait pas le travail, en particulier si vous souhaitez remplacer les multiples espaces par un seul comme transformer "this example" en "this example".
Jorge E. Cardona
3
@ JorgeE.Cardona - Une chose sur laquelle vous vous trompez un peu - \sinclura des onglets alors que replace(" ", "")non.
Mais cela, hélas, supprime également l'espace intérieur, tandis que l'exemple de la question d'origine laisse les espaces intérieurs intacts.
Brandon Rhodes
12
#how to trim a multi line string or a file
s=""" line one
\tline two\t
line three """#line1 starts with a space, #2 starts and ends with a tab, #3 ends with a space.
s1=s.splitlines()print s1
[' line one','\tline two\t','line three ']print[i.strip()for i in s1]['line one','line two','line three']#more details:#we could also have used a forloop from the begining:for line in s.splitlines():
line=line.strip()
process(line)#we could also be reading a file line by line.. e.g. my_file=open(filename), or with open(filename) as myfile:for line in my_file:
line=line.strip()
process(line)#moot point: note splitlines() removed the newline characters, we can keep them by passing True:#although split() will then remove them anyway..
s2=s.splitlines(True)print s2
[' line one\n','\tline two\t\n','line three ']
L' espace comprend l' espace, les tabulations et le CRLF . Donc, une fonction de chaîne élégante et à une ligne que nous pouvons utiliser est la traduction .
Après avoir examiné plusieurs solutions ici avec différents degrés de compréhension, je me suis demandé quoi faire si la chaîne était séparée par des virgules ...
le problème
En essayant de traiter une csv d'informations de contact, j'avais besoin d'une solution à ce problème: couper les espaces étrangers et certains déchets, mais conserver les virgules de fin et les espaces internes. En travaillant avec un champ contenant des notes sur les contacts, je voulais enlever les ordures, laissant les bonnes choses. En supprimant toute la ponctuation et la balle, je ne voulais pas perdre l'espace blanc entre les jetons composés car je ne voulais pas reconstruire plus tard.
expression régulière et modèles: [\s_]+?\W+
Le modèle recherche des instances uniques de n'importe quel caractère d'espacement et le trait de soulignement ('_') de 1 à un nombre illimité de fois paresseusement (aussi peu de caractères que possible), [\s_]+?avant les caractères non verbaux se produisant de 1 à une quantité illimitée de temps avec ceci: \W+(est équivalent à [^a-zA-Z0-9_]). Plus précisément, cela trouve des étendues d'espaces: caractères nuls (\ 0), tabulations (\ t), nouvelles lignes (\ n), feed-forward (\ f), retours chariot (\ r).
Je vois l'avantage à cela comme double:
qu'il ne supprime pas les espaces entre les mots / jetons complets que vous voudrez peut-être garder ensemble;
La méthode de chaîne intégrée de Python strip()ne traite pas à l'intérieur de la chaîne, juste les extrémités gauche et droite, et l'argument par défaut est des caractères nuls (voir l'exemple ci-dessous: plusieurs sauts de ligne sont dans le texte, et strip()ne les suppriment pas tous alors que le modèle regex le fait) .text.strip(' \n\t\r')
Cela va au-delà de la question des PO, mais je pense qu'il y a beaucoup de cas où nous pourrions avoir des instances étranges et pathologiques dans les données de texte, comme je l'ai fait (comment les caractères d'échappement se sont retrouvés dans une partie du texte). De plus, dans les chaînes de type liste, nous ne voulons pas éliminer le délimiteur à moins que le délimiteur ne sépare deux espaces ou un caractère autre qu'un mot, comme '-,' ou '-, ,,,'.
NB: Ne parle pas du délimiteur du CSV lui-même. Uniquement les instances du CSV où les données sont de type liste, c'est-à-dire une chaîne cs de sous-chaînes.
Divulgation complète: je ne manipule du texte que depuis environ un mois, et je ne regex que les deux dernières semaines, donc je suis sûr qu'il manque certaines nuances. Cela dit, pour les petites collections de chaînes (les miennes sont dans un cadre de données de 12 000 lignes et 40 colonnes impaires), comme dernière étape après un passage pour la suppression des caractères étrangers, cela fonctionne exceptionnellement bien, surtout si vous introduisez des espaces supplémentaires où vous vous voulez séparer le texte joint par un caractère autre qu'un mot, mais vous ne voulez pas ajouter d'espaces là où il n'y en avait pas auparavant.
Un exemple:
import re
text ="\"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, [email protected], ,dd invites,subscribed,, master, , , , dd invites,subscribed, , , , \r, , \0, ff dd \n invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s, \n i69rpofhfsp9t7c practice 20ignition - 20june \t\n .2134.pdf 2109 \n\n\n\nklkjsdf\""print(f"Here is the text as formatted:\n{text}\n")print()print("Trimming both the whitespaces and the non-word characters that follow them.")print()
trim_ws_punctn = re.compile(r'[\s_]+?\W+')
clean_text = trim_ws_punctn.sub(' ', text)print(clean_text)print()print("what about 'strip()'?")print(f"Here is the text, formatted as is:\n{text}\n")
clean_text = text.strip(' \n\t\r')# strip out whitespace?print()print(f"Here is the text, formatted as is:\n{clean_text}\n")print()print("Are 'text' and 'clean_text' unchanged?")print(clean_text == text)
Cela produit:
Hereis the text as formatted:"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, [email protected], ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"
using regex to trim both the whitespaces and the non-word characters that follow them."portfolio, derp, hello-world, hello-, world, founders, mentors, ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, ff, series a, exit, general mailing, fr, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, [email protected], dd invites,subscribed,, master, dd invites,subscribed, ff dd invites, subscribed, alumni spring 2012 deck: https: www.dropbox.com s, i69rpofhfsp9t7c practice 20ignition 20june 2134.pdf 2109 klkjsdf"Very nice.What about 'strip()'?Hereis the text, formatted asis:"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, [email protected], ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"Hereis the text, after stipping with'strip':"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, [email protected], ,dd invites,subscribed,, master, , , , dd invites,subscribed, ,, , , ff dd
invites, subscribed, , , , , alumni spring 2012 deck: https: www.dropbox.com s,
i69rpofhfsp9t7c practice 20ignition - 20june
.2134.pdf 2109
klkjsdf"Are'text'and'clean_text' unchanged?'True'
Donc, strip supprime un espace à la fois. Donc, dans le cas des PO, ça strip()va. mais si les choses deviennent plus complexes, l'expression régulière et un modèle similaire peuvent être d'une certaine valeur pour des paramètres plus généraux.
Si vous souhaitez supprimer l'espace blanc uniquement au début et à la fin de la chaîne, vous pouvez faire quelque chose comme ceci:
some_string =" Hello, world!\n "
new_string = some_string.strip()# new_string is now "Hello, world!"
Cela fonctionne beaucoup comme la méthode QString :: trimmed () de Qt, en ce sens qu'elle supprime les espaces de début et de fin, tout en laissant les espaces internes seuls.
Mais si vous souhaitez quelque chose comme la méthode QString :: simplified () de Qt qui non seulement supprime les espaces blancs de début et de fin, mais également "écrase" tous les espaces blancs internes consécutifs en un seul caractère d'espace, vous pouvez utiliser une combinaison de .split()et " ".join, comme ceci:
some_string ="\t Hello, \n\t world!\n "
new_string =" ".join(some_string.split())# new_string is now "Hello, world!"
Dans ce dernier exemple, chaque séquence d'espaces internes est remplacée par un seul espace, tout en supprimant les espaces au début et à la fin de la chaîne.
>>> myStr ="Hi\n Stack Over \r flow!">>> charList =[u"\u005Cn",u"\u005Cr",u"\u005Ct"]>>>import re
>>>for i in charList:
myStr = re.sub(i, r"", myStr)>>> myStr
'Hi Stack Over flow'
Remarque: Ceci sert uniquement à supprimer "\ n", "\ r" et "\ t" uniquement. Il ne supprime pas les espaces supplémentaires.
Pourquoi utiliser une expression régulière quand s.strip()fait exactement cela?
Ned Batchelder
1
s.strip()ne gère que l' espace blanc initial , mais pas les espaces "découverts" après avoir supprimé les autres caractères indésirables. Notez que cela supprimera même les espaces blancs après le dernier classement\n
Rafe
Quelqu'un a voté contre cette réponse mais n'a pas expliqué pourquoi elle est défectueuse. Honte à vous (@NedBatchelder si le vote négatif était vous, inversez s'il vous plait car j'ai expliqué votre question et vous n'avez rien dit de réellement cassé avec ma réponse)
Rafe
10
Rafe, vous voudrez peut-être revérifier: s.strip()produit exactement le même résultat que votre regex.
Ned Batchelder
3
@Rafe, vous le confondez avec le trim. Strip effectue les opérations requises.
string.whitespace
.Réponses:
Espace des deux côtés:
Espace sur le côté droit:
Espace sur le côté gauche:
Comme le souligne thedz , vous pouvez fournir un argument pour supprimer des caractères arbitraires à l'une de ces fonctions comme ceci:
Cela bande d'espace,
\t
,\n
, ou\r
caractères à partir du côté gauche, à droite ou des deux côtés de la chaîne.Les exemples ci-dessus suppriment uniquement les chaînes des côtés gauche et droit des chaînes. Si vous souhaitez également supprimer des caractères au milieu d'une chaîne, essayez
re.sub
:Cela devrait imprimer:
la source
str.replace(" ","")
. Vous n'avez pas besoin d'utiliserre
, sauf si vous avez plus d'un espace, alors votre exemple ne fonctionne pas.[]
est conçu pour marquer des caractères uniques, il n'est pas nécessaire si vous utilisez uniquement\s
. Utilisez soit\s+
ou[\s]+
(inutile) mais[\s+]
ne fait pas le travail, en particulier si vous souhaitez remplacer les multiples espaces par un seul comme transformer"this example"
en"this example"
.\s
inclura des onglets alors quereplace(" ", "")
non.La
trim
méthode Python est appeléestrip
:la source
Pour les espaces blancs de début et de fin:
Sinon, une expression régulière fonctionne:
la source
pat = re.compile(r'\s+')
sub(" ", s)
pas que""
le plus tard fusionne les mots et vous ne pourrez plus utiliser la.split(" ")
tokenisation.print
déclarationsVous pouvez également utiliser une fonction très simple et basique: str.replace () , fonctionne avec les espaces et les onglets:
Simple et facile.
la source
la source
Personne n'a encore publié ces solutions regex.
Correspondant à:
Recherche (vous devez gérer différemment le cas de saisie "uniquement les espaces"):
Si vous utilisez
re.sub
, vous pouvez supprimer les espaces intérieurs, ce qui pourrait être indésirable.la source
L' espace comprend l' espace, les tabulations et le CRLF . Donc, une fonction de chaîne élégante et à une ligne que nous pouvons utiliser est la traduction .
' hello apple'.translate(None, ' \n\t\r')
OU si vous voulez être minutieux
la source
Cela supprimera tous les espaces indésirables et les caractères de nouvelle ligne. J'espère que cette aide
Il en résultera:
'a b \ nc' sera changé en 'ab c'
la source
production:
Ajout du commentaire de Le Droid à la réponse. Pour séparer avec un espace:
production:
la source
Si vous utilisez Python 3: Dans votre instruction d'impression, terminez par sep = "". Cela séparera tous les espaces.
EXEMPLE:
Cela imprimera: J'adore les pommes de terre.
Au lieu de: j'aime les pommes de terre.
Dans votre cas, puisque vous tenteriez de vous débarrasser du \ t, faites sep = "\ t"
la source
Après avoir examiné plusieurs solutions ici avec différents degrés de compréhension, je me suis demandé quoi faire si la chaîne était séparée par des virgules ...
le problème
En essayant de traiter une csv d'informations de contact, j'avais besoin d'une solution à ce problème: couper les espaces étrangers et certains déchets, mais conserver les virgules de fin et les espaces internes. En travaillant avec un champ contenant des notes sur les contacts, je voulais enlever les ordures, laissant les bonnes choses. En supprimant toute la ponctuation et la balle, je ne voulais pas perdre l'espace blanc entre les jetons composés car je ne voulais pas reconstruire plus tard.
expression régulière et modèles:
[\s_]+?\W+
Le modèle recherche des instances uniques de n'importe quel caractère d'espacement et le trait de soulignement ('_') de 1 à un nombre illimité de fois paresseusement (aussi peu de caractères que possible),
[\s_]+?
avant les caractères non verbaux se produisant de 1 à une quantité illimitée de temps avec ceci:\W+
(est équivalent à[^a-zA-Z0-9_]
). Plus précisément, cela trouve des étendues d'espaces: caractères nuls (\ 0), tabulations (\ t), nouvelles lignes (\ n), feed-forward (\ f), retours chariot (\ r).Je vois l'avantage à cela comme double:
qu'il ne supprime pas les espaces entre les mots / jetons complets que vous voudrez peut-être garder ensemble;
La méthode de chaîne intégrée de Python
strip()
ne traite pas à l'intérieur de la chaîne, juste les extrémités gauche et droite, et l'argument par défaut est des caractères nuls (voir l'exemple ci-dessous: plusieurs sauts de ligne sont dans le texte, etstrip()
ne les suppriment pas tous alors que le modèle regex le fait) .text.strip(' \n\t\r')
Cela va au-delà de la question des PO, mais je pense qu'il y a beaucoup de cas où nous pourrions avoir des instances étranges et pathologiques dans les données de texte, comme je l'ai fait (comment les caractères d'échappement se sont retrouvés dans une partie du texte). De plus, dans les chaînes de type liste, nous ne voulons pas éliminer le délimiteur à moins que le délimiteur ne sépare deux espaces ou un caractère autre qu'un mot, comme '-,' ou '-, ,,,'.
NB: Ne parle pas du délimiteur du CSV lui-même. Uniquement les instances du CSV où les données sont de type liste, c'est-à-dire une chaîne cs de sous-chaînes.
Divulgation complète: je ne manipule du texte que depuis environ un mois, et je ne regex que les deux dernières semaines, donc je suis sûr qu'il manque certaines nuances. Cela dit, pour les petites collections de chaînes (les miennes sont dans un cadre de données de 12 000 lignes et 40 colonnes impaires), comme dernière étape après un passage pour la suppression des caractères étrangers, cela fonctionne exceptionnellement bien, surtout si vous introduisez des espaces supplémentaires où vous vous voulez séparer le texte joint par un caractère autre qu'un mot, mais vous ne voulez pas ajouter d'espaces là où il n'y en avait pas auparavant.
Un exemple:
Cela produit:
Donc, strip supprime un espace à la fois. Donc, dans le cas des PO, ça
strip()
va. mais si les choses deviennent plus complexes, l'expression régulière et un modèle similaire peuvent être d'une certaine valeur pour des paramètres plus généraux.le voir en action
la source
essayez de traduire
la source
Si vous souhaitez supprimer l'espace blanc uniquement au début et à la fin de la chaîne, vous pouvez faire quelque chose comme ceci:
Cela fonctionne beaucoup comme la méthode QString :: trimmed () de Qt, en ce sens qu'elle supprime les espaces de début et de fin, tout en laissant les espaces internes seuls.
Mais si vous souhaitez quelque chose comme la méthode QString :: simplified () de Qt qui non seulement supprime les espaces blancs de début et de fin, mais également "écrase" tous les espaces blancs internes consécutifs en un seul caractère d'espace, vous pouvez utiliser une combinaison de
.split()
et" ".join
, comme ceci:Dans ce dernier exemple, chaque séquence d'espaces internes est remplacée par un seul espace, tout en supprimant les espaces au début et à la fin de la chaîne.
la source
En général, j'utilise la méthode suivante:
Remarque: Ceci sert uniquement à supprimer "\ n", "\ r" et "\ t" uniquement. Il ne supprime pas les espaces supplémentaires.
la source
pour supprimer les espaces blancs du milieu de la chaîne
production:
la source
Cela supprimera tous les espaces et les sauts de ligne du début et de la fin d'une chaîne:
la source
s.strip()
fait exactement cela?s.strip()
ne gère que l' espace blanc initial , mais pas les espaces "découverts" après avoir supprimé les autres caractères indésirables. Notez que cela supprimera même les espaces blancs après le dernier classement\n
s.strip()
produit exactement le même résultat que votre regex.