Apakah ada fungsi Python yang akan memangkas spasi (spasi dan tab) dari string?
Contoh: \t example string\t
→example string
string.whitespace
.
Apakah ada fungsi Python yang akan memangkas spasi (spasi dan tab) dari string?
Contoh: \t example string\t
→example string
string.whitespace
.
Jawaban:
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 \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
:
import re
print re.sub('[\s+]', '', s)
Itu harus dicetak:
astringexample
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"
.
\s
akan menyertakan tab sementara replace(" ", "")
tidak.
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"
pat = re.compile(r'\s+')
sub(" ", s)
tidak ""
nanti akan menggabungkan kata-kata dan Anda tidak lagi akan dapat menggunakan .split(" ")
tokenize.
print
pernyataan
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.
#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 ']
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.
(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'
something = "\t please_ \t remove_ all_ \n\n\n\nwhitespaces\n\t "
something = "".join(something.split())
keluaran:
please_remove_all_whitespaces
something = "\t please \t remove all extra \n\n\n\nwhitespaces\n\t "
something = " ".join(something.split())
keluaran:
harap hapus semua spasi putih tambahan
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"
Setelah melihat beberapa solusi di sini dengan berbagai tingkat pemahaman, saya bertanya-tanya apa yang harus dilakukan jika string dipisahkan koma ...
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.
[\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, )_(, jim.somedude@blahblah.com, ,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, )_(, jim.somedude@blahblah.com, ,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, jim.somedude@blahblah.com, 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, )_(, jim.somedude@blahblah.com, ,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, )_(, jim.somedude@blahblah.com, ,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.
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'
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.
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.
untuk menghapus spasi putih dari tengah string
$p = "ATGCGAC ACGATCGACC";
$p =~ s/\s//g;
print $p;
keluaran:
ATGCGACACGATCGACC
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"
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.