Is er een Python-functie die witruimte (spaties en tabs) uit een tekenreeks haalt?
Voorbeeld: \t example string\t
→ example 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 trim
Methode 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.sub
gebruikt, 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:
-
dat het witruimte niet verwijdert tussen de volledige woorden / tokens die u misschien bij elkaar wilt houden;
-
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 enstrip()
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.
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"