Bagaimana cara saya memotong spasi?

1071

Apakah ada fungsi Python yang akan memangkas spasi (spasi dan tab) dari string?

Contoh: \t example string\texample string

Chris
sumber
1
Terimakasih atas peringatannya. Saya telah menemukan fungsi jalur sebelumnya, tetapi tidak tampaknya akan bekerja untuk masukan saya ..
Chris
1
Sama seperti: stackoverflow.com/questions/761804/trimming-a-string-in-python (meskipun pertanyaan ini sedikit lebih jelas, IMHO). Ini juga hampir sama: stackoverflow.com/questions/959215/…
Jonik
6
Karakter python menganggap spasi disimpan di string.whitespace.
John Fouhy
2
Maksud "strip" maksud Anda metode strip? "sepertinya tidak berfungsi untuk input saya" Tolong berikan kode Anda, input Anda dan output.
S.Lott
5
Kemungkinan duplikat
Memotong

Jawaban:

1600

Spasi di kedua sisi:

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

Spasi di sisi kanan:

s = s.rstrip()

Spasi di sisi kiri:

s = s.lstrip()

Seperti yang ditunjukkan oleh thedz , Anda dapat memberikan argumen untuk menghapus karakter arbitrer ke salah satu fungsi berikut:

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

Ini akan strip ruang apapun, \t, \n, atau \rkarakter dari sisi kiri, sisi kanan, atau kedua sisi string.

Contoh di atas hanya menghilangkan string dari sisi kiri dan kanan string. Jika Anda ingin juga menghapus karakter dari tengah string, coba re.sub:

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

Itu harus dicetak:

astringexample
James Thompson
sumber
18
strip () membutuhkan arguemnt untuk memberi tahu apa yang harus dilakukan. Coba: strip ('\ t \ n \ r')
thedz
3
Hasil untuk contoh-contoh harus cukup membantu :)
ton
4
Tidak perlu mencantumkan karakter spasi putih: docs.python.org/2/library/string.html#string.whitespace
jesuis
3
Contoh terakhir persis seperti menggunakan str.replace(" ",""). Anda tidak perlu menggunakan re, kecuali Anda memiliki lebih dari satu ruang, maka contoh Anda tidak berfungsi. []dirancang untuk menandai karakter tunggal, itu tidak perlu jika Anda hanya menggunakan \s. Gunakan salah satu \s+atau [\s]+(tidak perlu) tetapi [\s+]tidak melakukan pekerjaan, khususnya jika Anda ingin mengganti beberapa ruang dengan satu seperti mengubah "this example" menjadi "this example".
Jorge E. Cardona
3
@ JorgeE.Cardona - Satu hal yang sedikit salah tentang Anda - \sakan menyertakan tab sementara replace(" ", "")tidak.
ArtOfWarfare
72

trimMetode Python disebut strip:

str.strip() #trim
str.lstrip() #ltrim
str.rstrip() #rtrim
gcb
sumber
5
yang mudah diingat karena s tri p terlihat hampir seperti tri m.
isar
22

Untuk memimpin dan mengikuti spasi:

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

Kalau tidak, ekspresi reguler berfungsi:

import re
pat = re.compile(r'\s+')
s = '  \t  foo   \t   bar \t  '
print pat.sub('', s) # prints "foobar"
ars
sumber
1
Anda tidak mengkompilasi regex Anda. Anda harus membuatnya menjadipat = re.compile(r'\s+')
Evan Fosmark
Biasanya Anda ingin sub(" ", s)tidak ""nanti akan menggabungkan kata-kata dan Anda tidak lagi akan dapat menggunakan .split(" ")tokenize.
user3467349
alangkah baiknya untuk melihat output dari printpernyataan
Ron Klein
19

Anda juga dapat menggunakan fungsi yang sangat sederhana, dan dasar: str.replace () , berfungsi dengan spasi dan tab putih:

>>> whitespaces = "   abcd ef gh ijkl       "
>>> tabs = "        abcde       fgh        ijkl"

>>> print whitespaces.replace(" ", "")
abcdefghijkl
>>> print tabs.replace(" ", "")
abcdefghijkl

Sederhana dan mudah.

Lucas
sumber
2
Tapi ini, sayangnya, juga menghilangkan ruang interior, sementara contoh dalam pertanyaan asli membuat ruang interior tidak tersentuh.
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 ']
raja robert
sumber
4

Belum ada yang mengirim solusi regex ini.

Sesuai:

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

Pencarian (Anda harus menangani case input "hanya spasi" secara berbeda):

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

Jika Anda menggunakan re.sub, Anda dapat menghapus spasi putih bagian dalam, yang mungkin tidak diinginkan.

pengguna1149913
sumber
3

Spasi mencakup ruang, tab, dan CRLF . Jadi fungsi string yang elegan dan satu garis yang dapat kita gunakan adalah menerjemahkan .

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

ATAU jika Anda ingin teliti

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

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

Ini akan menghapus semua spasi dan karakter baris baru yang tidak diinginkan. Semoga bantuan ini

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

Ini akan menghasilkan:

'a b \ nc' akan diubah menjadi 'ab c'

Safvan CK
sumber
2
    something = "\t  please_     \t remove_  all_    \n\n\n\nwhitespaces\n\t  "

    something = "".join(something.split())

keluaran:

please_remove_all_whitespaces


Menambahkan komentar Le Droid ke jawabannya. Untuk memisahkan dengan spasi:

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

keluaran:

harap hapus semua spasi putih tambahan

pbn
sumber
1
Sederhana dan efisien. Bisa menggunakan "" .join (... untuk menjaga kata-kata dipisahkan dengan spasi.
Le Droid
1

Jika menggunakan Python 3: Dalam pernyataan cetak Anda, selesaikan dengan sep = "". Itu akan memisahkan semua ruang.

CONTOH:

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

Ini akan mencetak: Saya suka kentang.

Alih-alih: Saya suka kentang.

Dalam kasus Anda, karena Anda akan mencoba untuk mendapatkan \ t, lakukan sep = "\ t"

morgansmnm
sumber
1

Setelah melihat beberapa solusi di sini dengan berbagai tingkat pemahaman, saya bertanya-tanya apa yang harus dilakukan jika string dipisahkan koma ...

masalah

Saat mencoba memproses csv informasi kontak, saya memerlukan solusi untuk masalah ini: memangkas ruang kosong dan beberapa sampah, tetapi mempertahankan tanda koma, dan ruang putih internal. Bekerja dengan bidang yang berisi catatan pada kontak, saya ingin menghapus sampah, meninggalkan barang bagus. Memangkas semua tanda baca dan sekam, saya tidak ingin kehilangan ruang kosong antara token majemuk karena saya tidak ingin membangun kembali nanti.

regex dan pola: [\s_]+?\W+

Pola mencari contoh tunggal dari setiap karakter spasi putih dan garis bawah ('_') dari 1 hingga jumlah tak terbatas kali malas (sesedikit mungkin karakter) dengan [\s_]+?yang datang sebelum karakter non-kata terjadi dari 1 ke jumlah tak terbatas dari waktu dengan ini: \W+(setara dengan [^a-zA-Z0-9_]). Secara khusus, ini menemukan petak spasi putih: karakter nol (\ 0), tab (\ t), baris baru (\ n), umpan maju (\ f), carriage return (\ r).

Saya melihat keuntungan dari ini sebagai dua kali lipat:

  1. bahwa itu tidak menghapus spasi putih antara kata-kata / token lengkap yang Anda mungkin ingin tetap bersama;

  2. Metode string strip()bawaan Python tidak berurusan dengan string, hanya ujung kiri dan kanan, dan arg default adalah karakter nol (lihat contoh di bawah ini: beberapa baris baru ada dalam teks, dan strip()tidak menghapus semuanya sementara pola regex melakukannya) .text.strip(' \n\t\r')

Ini melampaui pertanyaan OPs, tapi saya pikir ada banyak kasus di mana kita mungkin memiliki contoh aneh, patologis dalam data teks, seperti yang saya lakukan (beberapa bagaimana karakter melarikan diri berakhir di beberapa teks). Selain itu, dalam string seperti daftar, kami tidak ingin menghilangkan pembatas kecuali pembatas memisahkan dua karakter spasi putih atau beberapa karakter non-kata, seperti '-,' atau '-, ,,,'.

NB: Tidak berbicara tentang pembatas CSV itu sendiri. Hanya contoh dalam CSV yang datanya seperti daftar, yaitu string substring cs.

Pengungkapan penuh: Saya hanya memanipulasi teks selama sekitar satu bulan, dan hanya regex dua minggu terakhir, jadi saya yakin ada beberapa nuansa yang saya lewatkan. Yang mengatakan, untuk koleksi string yang lebih kecil (tambang berada dalam kerangka data 12.000 baris dan 40 kolom ganjil), sebagai langkah terakhir setelah melewati untuk menghilangkan karakter asing, ini bekerja sangat baik, terutama jika Anda memperkenalkan beberapa spasi putih tambahan di mana Anda ingin memisahkan teks bergabung dengan karakter non-kata, tetapi tidak ingin menambahkan spasi putih di mana sebelumnya tidak ada.

Sebuah contoh:

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)

Output ini:

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'

Jadi strip menghapus satu spasi putih pada satu waktu. Jadi dalam kasus OP, strip()baik-baik saja. tetapi jika segalanya menjadi lebih kompleks, regex dan pola yang serupa mungkin bernilai untuk pengaturan yang lebih umum.

melihatnya dalam aksi

joshua fiddler
sumber
0

coba terjemahkan

>>> 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'
海洋 顶端
sumber
0

Jika Anda ingin memotong spasi putih dari awal dan akhir string, Anda dapat melakukan sesuatu seperti ini:

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

Ini sangat mirip dengan metode Qt's QString :: trimmed (), dalam hal ini menghapus spasi spasi awal dan akhir, sambil meninggalkan ruang spasi internal saja.

Tetapi jika Anda ingin sesuatu seperti metode Qttring :: simplified () Qt yang tidak hanya menghilangkan spasi spasi awal dan akhir, tetapi juga "memadatkan" semua spasi putih internal berturut-turut ke satu karakter ruang, Anda dapat menggunakan kombinasi dari .split()dan " ".join, seperti ini:

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

Dalam contoh terakhir ini, setiap urutan spasi putih internal diganti dengan satu ruang tunggal, sementara masih memangkas ruang kosong dari awal dan akhir string.

JL
sumber
-1

Secara umum, saya menggunakan metode berikut:

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

Catatan: Ini hanya untuk menghapus "\ n", "\ r" dan "\ t" saja. Itu tidak menghapus spasi tambahan.

Mayur Koshti
sumber
-2

untuk menghapus spasi putih dari tengah string

$p = "ATGCGAC ACGATCGACC";
$p =~ s/\s//g;
print $p;

keluaran:

ATGCGACACGATCGACC
Tuan Roshi
sumber
1
pertanyaan ini adalah tentang python, bukan Javascript atau perl
phuclv
-17

Ini akan menghapus semua spasi putih dan baris baru dari awal dan akhir string:

>>> s = "  \n\t  \n   some \n text \n     "
>>> re.sub("^\s+|\s+$", "", s)
>>> "some \n text"
Rafe
sumber
8
Mengapa menggunakan regex kapan s.strip()tepatnya?
Ned Batchelder
1
s.strip()hanya menangani ruang putih awal , tetapi bukan spasi "ditemukan" setelah menghapus karakter yang tidak diinginkan lainnya. Perhatikan bahwa ini akan menghapus bahkan spasi setelah memimpin akhir\n
Rafe
Seseorang menolak pilihan ini tetapi tidak menjelaskan mengapa itu salah. Malu pada Anda (@NedBatchelder jika suara turun Anda tolong mundur saat saya menjelaskan pertanyaan Anda dan Anda tidak menyebutkan sesuatu yang benar-benar rusak dengan jawaban saya)
Rafe
10
Rafe, Anda mungkin ingin memeriksa: s.strip()menghasilkan hasil yang persis sama dengan regex Anda.
Ned Batchelder
3
@ Aman, Anda bingung dengan trim. Strip melakukan operasi yang diperlukan.
iMitwe