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.
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 ']
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:
bahwa itu tidak menghapus spasi putih antara kata-kata / token lengkap yang Anda mungkin ingin tetap bersama;
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:
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'
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.
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.
>>> 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.
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.
string.whitespace
.Jawaban:
Spasi di kedua sisi:
Spasi di sisi kanan:
Spasi di sisi kiri:
Seperti yang ditunjukkan oleh thedz , Anda dapat memberikan argumen untuk menghapus karakter arbitrer ke salah satu fungsi berikut:
Ini akan strip ruang apapun,
\t
,\n
, atau\r
karakter 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
:Itu harus dicetak:
sumber
str.replace(" ","")
. Anda tidak perlu menggunakanre
, 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"
.\s
akan menyertakan tab sementarareplace(" ", "")
tidak.trim
Metode Python disebutstrip
:sumber
Untuk memimpin dan mengikuti spasi:
Kalau tidak, ekspresi reguler berfungsi:
sumber
pat = re.compile(r'\s+')
sub(" ", s)
tidak""
nanti akan menggabungkan kata-kata dan Anda tidak lagi akan dapat menggunakan.split(" ")
tokenize.print
pernyataanAnda juga dapat menggunakan fungsi yang sangat sederhana, dan dasar: str.replace () , berfungsi dengan spasi dan tab putih:
Sederhana dan mudah.
sumber
sumber
Belum ada yang mengirim solusi regex ini.
Sesuai:
Pencarian (Anda harus menangani case input "hanya spasi" secara berbeda):
Jika Anda menggunakan
re.sub
, Anda dapat menghapus spasi putih bagian dalam, yang mungkin tidak diinginkan.sumber
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
sumber
Ini akan menghapus semua spasi dan karakter baris baru yang tidak diinginkan. Semoga bantuan ini
Ini akan menghasilkan:
'a b \ nc' akan diubah menjadi 'ab c'
sumber
keluaran:
Menambahkan komentar Le Droid ke jawabannya. Untuk memisahkan dengan spasi:
keluaran:
sumber
Jika menggunakan Python 3: Dalam pernyataan cetak Anda, selesaikan dengan sep = "". Itu akan memisahkan semua ruang.
CONTOH:
Ini akan mencetak: Saya suka kentang.
Alih-alih: Saya suka kentang.
Dalam kasus Anda, karena Anda akan mencoba untuk mendapatkan \ t, lakukan sep = "\ t"
sumber
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:
bahwa itu tidak menghapus spasi putih antara kata-kata / token lengkap yang Anda mungkin ingin tetap bersama;
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, danstrip()
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:
Output ini:
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
sumber
coba terjemahkan
sumber
Jika Anda ingin memotong spasi putih dari awal dan akhir string, Anda dapat melakukan sesuatu seperti ini:
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:Dalam contoh terakhir ini, setiap urutan spasi putih internal diganti dengan satu ruang tunggal, sementara masih memangkas ruang kosong dari awal dan akhir string.
sumber
Secara umum, saya menggunakan metode berikut:
Catatan: Ini hanya untuk menghapus "\ n", "\ r" dan "\ t" saja. Itu tidak menghapus spasi tambahan.
sumber
untuk menghapus spasi putih dari tengah string
keluaran:
sumber
Ini akan menghapus semua spasi putih dan baris baru dari awal dan akhir string:
sumber
s.strip()
tepatnya?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
s.strip()
menghasilkan hasil yang persis sama dengan regex Anda.