Hoe kan ik witruimte bijsnijden?

Is er een Python-functie die witruimte (spaties en tabs) uit een tekenreeks haalt?

Voorbeeld: \t example string\texample string


Antwoord 1, autoriteit 100%

Gebruik voor witruimte aan beide zijden str.strip:

s = "  \t a string example\t  "
s = s.strip()

Gebruik voor witruimte aan de rechterkant rstrip:

s = s.rstrip()

Voor witruimte aan de linkerkant lstrip:

s = s.lstrip()

Zoals thedzaangeeft, kunt u als volgt een argument opgeven om willekeurige tekens voor elk van deze functies te verwijderen:

s = s.strip(' \t\n\r')

Hiermee worden alle spatie-, \t-, \n– of \r-tekens aan de linkerkant, aan de rechterkant verwijderd kant, of beide kanten van de string.

De bovenstaande voorbeelden verwijderen alleen strings van de linker- en rechterkant van strings. Als je ook tekens uit het midden van een tekenreeks wilt verwijderen, probeer dan re.sub:

import re
print(re.sub('[\s+]', '', s))

die moeten afdrukken:

astringexample

Antwoord 2, Autoriteit 5%

Python trimMethode wordt strip:

str.strip() #trim
str.lstrip() #ltrim
str.rstrip() #rtrim

Antwoord 3

Voor het leiden en trailen van WhiteSpace:

s = '   foo    \t   '
print s.strip() # prints "foo"

Anders werkt een reguliere expressie:

import re
pat = re.compile(r'\s+')
s = '  \t  foo   \t   bar \t  '
print pat.sub('', s) # prints "foobar"

Antwoord 4

U kunt ook een zeer eenvoudige en basisfunctie gebruiken: str.replace () , Werkt met de witvakken en tabbladen:

>>> whitespaces = "   abcd ef gh ijkl       "
>>> tabs = "        abcde       fgh        ijkl"
>>> print whitespaces.replace(" ", "")
abcdefghijkl
>>> print tabs.replace(" ", "")
abcdefghijkl

eenvoudig en eenvoudig.


Antwoord 5

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

Antwoord 6

Niemand heeft deze regex-oplossingen nog gepost.

Overeenkomst:

>>> import re
>>> p=re.compile('\\s*(.*\\S)?\\s*')
>>> m=p.match('  \t blah ')
>>> m.group(1)
'blah'
>>> m=p.match('  \tbl ah  \t ')
>>> m.group(1)
'bl ah'
>>> m=p.match('  \t  ')
>>> print m.group(1)
None

Zoeken (u moet de invoer voor “alleen spaties” anders verwerken):

>>> p1=re.compile('\\S.*\\S')
>>> m=p1.search('  \tblah  \t ')
>>> m.group()
'blah'
>>> m=p1.search('  \tbl ah  \t ')
>>> m.group()
'bl ah'
>>> m=p1.search('  \t  ')
>>> m.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

Als u re.subgebruikt, kunt u de interne witruimte verwijderen, wat ongewenst kan zijn.


Antwoord 7

Witruimte omvat spatie, tabbladen en CRLF. Dus een elegante en one-linertekenreeksfunctie die we kunnen gebruiken is vertalen.

' hello apple'.translate(None, ' \n\t\r')

OFals je grondig wilt zijn

import string
' hello  apple'.translate(None, string.whitespace)

Antwoord 8

(re.sub(‘ +’, ‘ ‘,(my_str.replace(‘\n’,’ ‘)))).strip()

Hierdoor worden alle ongewenste spaties en nieuwe regeltekens verwijderd. Ik hoop dat dit helpt

import re
my_str = '   a     b \n c   '
formatted_str = (re.sub(' +', ' ',(my_str.replace('\n',' ')))).strip()

Dit resulteert in:

‘ een      b \n c ‘wordt gewijzigd in‘a b c’


Antwoord 9

   something = "\t  please_     \t remove_  all_    \n\n\n\nwhitespaces\n\t  "
    something = "".join(something.split())

uitvoer:

please_remove_all_whitespaces


De opmerking van Le Droid aan het antwoord toevoegen.
Scheiden met een spatie:

   something = "\t  please     \t remove  all   extra \n\n\n\nwhitespaces\n\t  "
    something = " ".join(something.split())

uitvoer:

verwijder alle extra spaties


Antwoord 10

Nadat ik hier nogal wat oplossingen met verschillende gradaties van begrip had bekeken, vroeg ik me af wat ik moest doen als de string door komma’s gescheiden was…

het probleem

Tijdens het proberen een CSV-contactgegevens te verwerken, had ik een oplossing nodig Dit probleem: Trim externe witruimte en wat rommel, maar behoudende trailing commas en interne whitespace. Werken met een veld met aantekeningen op de contacten, wilde ik de vuilnis verwijderen en het goede spul achterlaten. Door alle interpunctie en kaf te trimmen, wilde ik de witruimte tussen de samengestelde tokens niet verliezen omdat ik later niet wilden opnieuw opbouwen.

Regex en patronen: [\s_]+?\W+

Het patroon zoekt naar enkele exemplaren van een WhiteSpace-karakter en de undercore (‘_’) van 1 tot een onbeperkt aantal keren lui (zo weinig mogelijk tekens met [\s_]+?die vóór niet-woordkarakters komen die optreden van 1 tot een onbeperkte hoeveelheid tijd met dit: \W+(is gelijk aan [^a-zA-Z0-9_]). In het bijzonder vindt dit zwadden van WhiteSpace: NULL-tekens (\ 0), tabbladen (\ t), newlines (\ n), feed-forward (\ f), koetsers returns (\ r).

Ik zie dit voordeel hiervan als tweevoudig:

  1. dat het witruimte niet verwijdert tussen de volledige woorden / tokens die u misschien bij elkaar wilt houden;

  2. Python’s ingebouwde stringmethode strip()niet in de tekenreeks, alleen de linker- en rechter uiteinden, en standaard Arg is null-tekens (zie hieronder voorbeeld: Verschillende newlines zijn In de tekst en strip()verwijdert ze niet allemaal terwijl het regex-patroon doet). text.strip(' \n\t\r')

Dit gaat verder dan de OPs-vraag, maar ik denk dat er tal van gevallen zijn waarin we vreemde, pathologische gevallen in de tekstgegevens kunnen hebben, zoals ik deed (sommige hoe de ontsnappingstekens in een deel van de tekst terechtkwamen). Bovendien willen we in lijstachtige tekenreeksen het scheidingsteken niet verwijderen, tenzij het scheidingsteken twee witruimtetekens of een niet-woordteken scheidt, zoals ‘-,’ of ‘-, ,,,’.

NB: Om nog maar niet te spreken over het scheidingsteken van de CSV zelf. Alleen van instanties binnen de CSV waar de gegevens lijstachtig zijn, d.w.z. een c.s. string van substrings.

Volledige openbaarmaking: ik manipuleer pas ongeveer een maand tekst en regex pas de laatste twee weken, dus ik weet zeker dat er enkele nuances zijn die ik mis. Dat gezegd hebbende, voor kleinere verzamelingen strings (de mijne bevinden zich in een dataframe van 12.000 rijen en 40 oneven kolommen), als laatste stap na een pass voor het verwijderen van vreemde tekens, werkt dit uitzonderlijk goed, vooral als je wat extra witruimte introduceert waar je tekst wilt scheiden die is samengevoegd door een niet-woordteken, maar geen witruimte wilt toevoegen waar er voorheen geen was.

Een voorbeeld:

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)

Dit geeft het volgende weer:

Here is 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()'?
Here is the text, formatted as is:
"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"
Here is 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'

Dus strip verwijdert één witruimte per keer. Dus in het geval van OP’s is strip()prima. maar als de zaken ingewikkelder worden, kunnen regex en een soortgelijk patroon van enige waarde zijn voor meer algemene instellingen.

zie het in actie


Antwoord 11

Als u Python 3 gebruikt: eindig in uw printopdracht met sep=””. Dat zal alle ruimtes scheiden.

VOORBEELD:

txt="potatoes"
print("I love ",txt,"",sep="")

Dit wordt afgedrukt:
Ik ben dol op aardappelen.

In plaats van:
Ik hou van aardappelen.

In jouw geval, aangezien je zou proberen om van de \t af te komen, doe sep=”\t”


Antwoord 12

probeer te vertalen

>>> import string
>>> print '\t\r\n  hello \r\n world \t\r\n'
  hello 
 world  
>>> tr = string.maketrans(string.whitespace, ' '*len(string.whitespace))
>>> '\t\r\n  hello \r\n world \t\r\n'.translate(tr)
'     hello    world    '
>>> '\t\r\n  hello \r\n world \t\r\n'.translate(tr).replace(' ', '')
'helloworld'

Antwoord 13

Als je de witruimte alleen aan het begin en einde van de tekenreeks wilt weghalen, kun je zoiets als dit doen:

some_string = "    Hello,    world!\n    "
new_string = some_string.strip()
# new_string is now "Hello,    world!"

Dit lijkt veel op de methode QString::trimmed() van Qt, in die zin dat het voor- en achterliggende witruimte verwijdert, terwijl de interne witruimte alleen wordt gelaten.

Maar als je iets wilt als Qt’s QString::simplified() methode die niet alleen voorloop- en volgspaties verwijdert, maar ook alle opeenvolgende interne witruimte “squishes” tot één spatieteken, dan kun je een combinatie van .split()en " ".join, zoals dit:

some_string = "\t    Hello,  \n\t  world!\n    "
new_string = " ".join(some_string.split())
# new_string is now "Hello, world!"

In dit laatste voorbeeld is elke reeks interne witruimte vervangen door een enkele spatie, terwijl de witruimte nog steeds wordt bijgesneden van het begin en het einde van de tekenreeks.


Antwoord 14

Over het algemeen gebruik ik de volgende methode:

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

Opmerking: dit is alleen voor het verwijderen van “\n”, “\r” en “\t”. Het verwijdert geen extra spaties.


Antwoord 15

Hiermee worden alle witruimten en nieuwe regels van zowel het begin als het einde van een tekenreeks verwijderd:

>>> s = "  \n\t  \n   some \n text \n     "
>>> re.sub("^\s+|\s+$", "", s)
>>> "some \n text"

Other episodes