Sepertinya ada harus menjadi cara yang lebih sederhana dari:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
Apakah ada?
Dari perspektif efisiensi, anda're tidak akan mengalahkan
s.translate(None, string.punctuation)
Untuk versi yang lebih tinggi dari Python menggunakan kode berikut:
s.translate(str.maketrans('', '', string.punctuation))
It's melakukan baku operasi string di C dengan lookup table - ada's tidak banyak yang akan mengalahkan itu, tetapi anda menulis sendiri kode C.
Jika kecepatan isn't khawatir, pilihan lain adalah:
exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)
Ini lebih cepat dari s.ganti dengan char masing-masing, tetapi tidak't melakukan serta non-python murni pendekatan seperti regexes atau string.menerjemahkan, seperti yang bisa anda lihat di bawah ini timing. Untuk jenis masalah ini, lakukan itu pada rendah tingkat mungkin terbayar.
Waktu kode:
import re, string, timeit
s = "string. With. Punctuation"
exclude = set(string.punctuation)
table = string.maketrans("","")
regex = re.compile('[%s]' % re.escape(string.punctuation))
def test_set(s):
return ''.join(ch for ch in s if ch not in exclude)
def test_re(s): # From Vinko's solution, with fix.
return regex.sub('', s)
def test_trans(s):
return s.translate(table, string.punctuation)
def test_repl(s): # From S.Lott's solution
for c in string.punctuation:
s=s.replace(c,"")
return s
print "sets :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000)
print "regex :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000)
print "translate :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000)
print "replace :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000)
Hal ini memberikan hasil sebagai berikut:
sets : 19.8566138744
regex : 6.86155414581
translate : 2.12455511093
replace : 28.4436721802
Ekspresi reguler yang cukup sederhana, jika anda tahu mereka.
import re
s = "string. With. Punctuation?"
s = re.sub(r'[^\w\s]','',s)
Untuk kenyamanan penggunaan, saya meringkas catatan striping tanda baca dari sebuah string di kedua Python 2 dan Python 3. Silakan lihat jawaban lain untuk keterangan rinci.
Python 2
import string
s = "string. With. Punctuation?"
table = string.maketrans("","")
new_s = s.translate(table, string.punctuation) # Output: string without punctuation
Python 3
import string
s = "string. With. Punctuation?"
table = str.maketrans(dict.fromkeys(string.punctuation)) # OR {key: None for key in string.punctuation}
new_s = s.translate(table) # Output: string without punctuation
string.tanda baca
adalah ASCII hanya! Yang lebih benar (tetapi juga jauh lebih lambat) cara adalah dengan menggunakan unicodedata modul:
# -*- coding: utf-8 -*-
from unicodedata import category
s = u'String — with - «punctation »...'
s = ''.join(ch for ch in s if category(ch)[0] != 'P')
print 'stripped', s
Anda dapat menggeneralisasi dan strip lainnya jenis karakter serta:
''.join(ch for ch in s if category(ch)[0] != 'SP')
Hal ini juga akan strip karakter seperti~*+§$
yang mungkin atau mungkin tidak menjadi "tanda baca" tergantung pada satu's point of view.
Tidak selalu yang sederhana, tapi dengan cara yang berbeda, jika anda lebih akrab dengan re keluarga.
import re, string
s = "string. With. Punctuation?" # Sample string
out = re.sub('[%s]' % re.escape(string.punctuation), '', s)
Untuk Python 3 str
atau Python 2 unicode
nilai-nilai, str.translate()
hanya membutuhkan kamus; codepoints (bilangan bulat) yang tampak dalam pemetaan itu dan apa-apa yang dipetakan ke None
dihapus.
Untuk menghapus (beberapa?) tanda baca kemudian, gunakan:
import string
remove_punct_map = dict.fromkeys(map(ord, string.punctuation))
s.translate(remove_punct_map)
The dict.fromkeys()
metode kelas membuat hal sepele untuk membuat pemetaan, pengaturan semua nilai ke None
berdasarkan urutan tombol.
Untuk menghapus semua tanda baca, tidak hanya ASCII tanda baca, meja anda perlu untuk menjadi sedikit lebih besar; lihat J. F. Sebastian's answer (Python versi 3):
import unicodedata
import sys
remove_punct_map = dict.fromkeys(i for i in range(sys.maxunicode)
if unicodedata.category(chr(i)).startswith('P'))
string.tanda baca
merindukan banyak tanda baca yang lazim digunakan dalam dunia nyata. Bagaimana solusi yang bekerja untuk non-ASCII tanda baca?
import regex
s = u"string. With. Some・Really Weird、Non?ASCII。 「(Punctuation)」?"
remove = regex.compile(ur'[\p{C}|\p{M}|\p{P}|\p{S}|\p{Z}]+', regex.UNICODE)
remove.sub(u" ", s).strip()
Secara pribadi, saya percaya ini adalah cara terbaik untuk menghapus tanda baca dari sebuah string di Python karena:
\{S}
jika anda ingin menghapus tanda baca, tapi menjaga simbol-simbol seperti $
.\{Pd}
hanya akan menghapus tanda hubung.Ini menggunakan Unicode karakter sifat, yang anda dapat membaca lebih lanjut tentang di Wikipedia.
Aku ingin't melihat jawaban ini belum. Hanya menggunakan regex; ini akan menghapus semua karakter selain karakter kata (\w
) dan jumlah karakter (\
d), diikuti oleh karakter spasi (s
):
import re
s = "string. With. Punctuation?" # Sample string
out = re.sub(ur'[^\w\d\s]+', '', s)
Berikut adalah fungsi yang saya tulis. It's sangat tidak efisien, tetapi sederhana dan anda dapat menambahkan atau menghapus tanda baca yang anda inginkan:
def stripPunc(wordList):
"""Strips punctuation from list of words"""
puncList = [".",";",":","!","?","/","\\",",","#","@","$","&",")","(","\""]
for punc in puncList:
for word in wordList:
wordList=[word.replace(punc,'') for word in wordList]
return wordList
Hanya sebagai update, saya menulis ulang @Brian contoh di Python 3 dan membuat perubahan untuk itu untuk bergerak regex menyusun langkah dalam fungsi. Saya pikir di sini adalah waktu untuk setiap langkah yang diperlukan untuk membuat fungsi kerja. Mungkin anda menggunakan komputasi terdistribusi dan dapat't memiliki regex objek bersama antara pekerja dan harus memiliki kembali.kompilasi
langkah pada setiap pekerja. Juga, saya penasaran untuk waktu dua implementasi yang berbeda dari maketrans untuk Python 3
table = str.maketrans({key: None for key in string.punctuation})
vs
table = str.maketrans('', '', string.punctuation)
Plus saya menambahkan metode lain untuk menggunakan set, di mana saya mengambil keuntungan dari persimpangan fungsi untuk mengurangi jumlah iterasi.
Ini adalah kode lengkap:
import re, string, timeit
s = "string. With. Punctuation"
def test_set(s):
exclude = set(string.punctuation)
return ''.join(ch for ch in s if ch not in exclude)
def test_set2(s):
_punctuation = set(string.punctuation)
for punct in set(s).intersection(_punctuation):
s = s.replace(punct, ' ')
return ' '.join(s.split())
def test_re(s): # From Vinko's solution, with fix.
regex = re.compile('[%s]' % re.escape(string.punctuation))
return regex.sub('', s)
def test_trans(s):
table = str.maketrans({key: None for key in string.punctuation})
return s.translate(table)
def test_trans2(s):
table = str.maketrans('', '', string.punctuation)
return(s.translate(table))
def test_repl(s): # From S.Lott's solution
for c in string.punctuation:
s=s.replace(c,"")
return s
print("sets :",timeit.Timer('f(s)', 'from __main__ import s,test_set as f').timeit(1000000))
print("sets2 :",timeit.Timer('f(s)', 'from __main__ import s,test_set2 as f').timeit(1000000))
print("regex :",timeit.Timer('f(s)', 'from __main__ import s,test_re as f').timeit(1000000))
print("translate :",timeit.Timer('f(s)', 'from __main__ import s,test_trans as f').timeit(1000000))
print("translate2 :",timeit.Timer('f(s)', 'from __main__ import s,test_trans2 as f').timeit(1000000))
print("replace :",timeit.Timer('f(s)', 'from __main__ import s,test_repl as f').timeit(1000000))
Ini adalah hasil saya:
sets : 3.1830138750374317
sets2 : 2.189873124472797
regex : 7.142953420989215
translate : 4.243278483860195
translate2 : 2.427158243022859
replace : 4.579746678471565
Berikut ini's solusi tanpa regex.
import string
input_text = "!where??and!!or$$then:)"
punctuation_replacer = string.maketrans(string.punctuation, ' '*len(string.punctuation))
print ' '.join(input_text.translate(punctuation_replacer).split()).strip()
output>> where and or then
#FIRST METHOD
#Storing all punctuations in a variable
punctuation='!?,.:;"\')(_-'
newstring='' #Creating empty string
word=raw_input("Enter string: ")
for i in word:
if(i not in punctuation):
newstring+=i
print "The string without punctuation is",newstring
#SECOND METHOD
word=raw_input("Enter string: ")
punctuation='!?,.:;"\')(_-'
newstring=word.translate(None,punctuation)
print "The string without punctuation is",newstring
#Output for both methods
Enter string: hello! welcome -to_python(programming.language)??,
The string without punctuation is: hello welcome topythonprogramminglanguage
with open('one.txt','r')as myFile:
str1=myFile.read()
print(str1)
punctuation = ['(', ')', '?', ':', ';', ',', '.', '!', '/', '"', "'"]
for i in punctuation:
str1 = str1.replace(i," ")
myList=[]
myList.extend(str1.split(" "))
print (str1)
for i in myList:
print(i,end='\n')
print ("____________")