Frage

Es scheint, wie es sollte eine einfachere Art und Weise sein als:

import string
s = "string. With. Punctuation?" # Sample string 
out = s.translate(string.maketrans("",""), string.punctuation)

Gibt es?

War es hilfreich?

Lösung

Aus Effizienzgesichtspunkten, sind Sie nicht zu schlagen gehen

s.translate(None, string.punctuation)

Für höhere Versionen von Python verwenden Sie folgenden Code:

s.translate(str.maketrans('', '', string.punctuation))

Es ist roh String-Operationen in C mit einer Lookup-Tabelle durchführen -. Es gibt nicht viel, dass die schlagen, aber Ihren eigenen C-Code zu schreiben

Wenn die Geschwindigkeit nicht eine Sorge ist, obwohl eine weitere Option:

exclude = set(string.punctuation)
s = ''.join(ch for ch in s if ch not in exclude)

Dies ist schneller als s.replace mit jedem Zeichen, aber nicht so gut wie nicht-reinem Python Ansätze wie regulären Ausdrücke oder string.translate durchführt, wie Sie aus den folgenden Zeitpunkt sehen. Für diese Art von Problem, es zu tun auf einem so niedrigen Niveau wie möglich auszahlt.

Timing Code:

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)

Dies ergibt folgende Ergebnisse:

sets      : 19.8566138744
regex     : 6.86155414581
translate : 2.12455511093
replace   : 28.4436721802

Andere Tipps

Reguläre Ausdrücke sind einfach genug, wenn Sie sie kennen.

import re
s = "string. With. Punctuation?"
s = re.sub(r'[^\w\s]','',s)

Im obigen Code, wir ersetzen (re.sub) Alle NON [alphanumerische Zeichen (\ w) und Leerzeichen (\ s)] mit leeren String zurück.
Daher. und ? Interpunktion wird in Variable nicht vorhanden sein, 's' nach dem Ausführen s Variable durch regex.

Für die Bequemlichkeit der Nutzung, ich die Notiz von Striping Interpunktion aus einer Zeichenfolge in beiden Python 2 und Python zusammenzufassen 3. Sie verweisen auf andere Antworten für die ausführliche Beschreibung.


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({key: None for key in string.punctuation})
new_s = s.translate(table)                          # Output: string without punctuation
myString.translate(None, string.punctuation)

ich in der Regel so etwas wie folgt verwenden:

>>> s = "string. With. Punctuation?" # Sample string
>>> import string
>>> for c in string.punctuation:
...     s= s.replace(c,"")
...
>>> s
'string With Punctuation'

string.punctuation ist ASCII nur ! Eine korrektere (aber auch viel langsamer) Art und Weise ist das unicodedata Modul zu verwenden:

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

Nicht unbedingt einfacher, aber eine andere Art und Weise, wenn Sie sind besser vertraut mit der Wieder Familie.

import re, string
s = "string. With. Punctuation?" # Sample string 
out = re.sub('[%s]' % re.escape(string.punctuation), '', s)

Für Python 3 str oder Python 2 unicode Werte, str.translate() dauert nur ein Wörterbuch; Codepoints (Integer) in dieser Abbildung und alles abgebildet sieht bis zu None entfernt wird.

So entfernen Sie (einige?) Interpunktion dann, zu verwenden:

import string

remove_punct_map = dict.fromkeys(map(ord, string.punctuation))
s.translate(remove_punct_map)

Die dict.fromkeys() Klassenmethode es trivial macht das schaffen Mapping, alle Werte Einstellung auf der Tastenfolge basierend auf None.

So entfernen Sie alle Interpunktion, nicht nur ASCII Interpunktion, muss Ihre Tabelle ein wenig größer sein; finden Sie unter J. F. Sebastian Antwort (Python 3-Version):

import unicodedata
import sys

remove_punct_map = dict.fromkeys(i for i in range(sys.maxunicode)
                                 if unicodedata.category(chr(i)).startswith('P'))

string.punctuation vermisst Lasten von Satzzeichen, die in der realen Welt häufig verwendet werden. Wie wäre es eine Lösung, die für Nicht-ASCII-Interpunktions funktioniert?

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

Ich persönlich glaube, dass dies der beste Weg ist, Interpunktion aus einer Zeichenfolge in Python zu entfernen, weil:

  • Es entfernt alle Unicode Interpunktion
  • Es ist leicht modifizierbar, beispiels Sie können die \{S} entfernen, wenn Sie Interpunktion entfernen möchten, aber Symbole halten wie $.
  • Sie können wirklich spezifisch bekommen über das, was Sie behalten möchten und was Sie zum Beispiel \{Pd} entfernen möchten nur Striche entfernen.
  • Diese Regex normalisiert auch Leerzeichen. Es ordnet Tabs, Zeilenumbrüche und andere Merkwürdigkeiten zu schön, einzelne Räume.

Dieses verwendet Unicode-Zeicheneigenschaften, die können Sie mehr über auf Wikipedia .

Dies ist vielleicht nicht die beste Lösung, aber das ist, wie ich es tat.

import string
f = lambda x: ''.join([i for i in x if i not in string.punctuation])

Hier ist eine Funktion, die ich geschrieben habe. Es ist nicht sehr effizient, aber es ist einfach und Sie können alle Satz hinzuzufügen oder zu entfernen, die Sie wünschen:

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

Hier ist ein Einzeiler für Python 3.5:

import string
"l*ots! o(f. p@u)n[c}t]u[a'ti\"on#$^?/".translate(str.maketrans({a:None for a in string.punctuation}))

Ich habe nicht diese Antwort noch nicht gesehen. Verwenden Sie einfach einen regulären Ausdruck; es entfernt alle Zeichen außer Wortzeichen (\w) und die Anzahl Zeichen (\d), gefolgt von einem Leerzeichen (\s):

import re
s = "string. With. Punctuation?" # Sample string 
out = re.sub(ur'[^\w\d\s]+', '', s)

Hier ist eine Lösung ohne 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
  • Ersetzt die Interpunktion mit Leerzeichen
  • Ersetzen mehrere Leerzeichen zwischen Wörtern mit einem einzigen Raum
  • Entfernen Sie die Leerzeichen, falls vorhanden mit Streifen ()

Wie ein Update, schrieb ich das @ Brian Beispiel in Python 3 und Änderungen, um es innerhalb der Funktion regex Kompilierung Schritt zu bewegen. Mein Gedanke war hier jeder einzelne Schritt zu Zeit erforderlich, um die Funktion der Arbeit zu machen. Vielleicht sind Sie mit Distributed Computing und nicht regex Objekt zwischen Ihren Mitarbeitern geteilt haben können und müssen re.compile Schritt bei jedem Arbeiter haben. Außerdem war ich zu der Zeit zwei verschiedene Implementierungen von maketrans für Python 3

neugierig
table = str.maketrans({key: None for key in string.punctuation})

vs

table = str.maketrans('', '', string.punctuation)

Plus Ich habe eine andere Methode gesetzt zu verwenden, wo ich den Vorteil der Schnittfunktion übernehmen Anzahl der Iterationen zu verringern.

Dies ist der vollständige Code:

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

Das ist meine Ergebnisse:

sets      : 3.1830138750374317
sets2      : 2.189873124472797
regex     : 7.142953420989215
translate : 4.243278483860195
translate2 : 2.427158243022859
replace   : 4.579746678471565
>>> s = "string. With. Punctuation?"
>>> s = re.sub(r'[^\w\s]','',s)
>>> re.split(r'\s*', s)


['string', 'With', 'Punctuation']
import re
s = "string. With. Punctuation?" # Sample string 
out = re.sub(r'[^a-zA-Z0-9\s]', '', s)

Ein Einzeiler könnte in nicht sehr streng Fällen hilfreich sein:

''.join([c for c in s if c.isalnum() or c.isspace()])
#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 ("____________")

Stoppwörter aus der Textdatei entfernen Python mit

print('====THIS IS HOW TO REMOVE STOP WORS====')

with open('one.txt','r')as myFile:

    str1=myFile.read()

    stop_words ="not", "is", "it", "By","between","This","By","A","when","And","up","Then","was","by","It","If","can","an","he","This","or","And","a","i","it","am","at","on","in","of","to","is","so","too","my","the","and","but","are","very","here","even","from","them","then","than","this","that","though","be","But","these"

    myList=[]

    myList.extend(str1.split(" "))

    for i in myList:

        if i not in stop_words:

            print ("____________")

            print(i,end='\n')

Dies ist, wie unsere Dokumente ändern in Großbuchstaben oder Kleinschreibung.

print('@@@@This is lower case@@@@')

with open('students.txt','r')as myFile:

    str1=myFile.read()
    str1.lower()
print(str1.lower())

print('*****This is upper case****')

with open('students.txt','r')as myFile:

    str1=myFile.read()

    str1.upper()

print(str1.upper())

Ich mag eine Funktion wie folgt verwenden:

def scrub(abc):
    while abc[-1] is in list(string.punctuation):
        abc=abc[:-1]
    while abc[0] is in list(string.punctuation):
        abc=abc[1:]
    return abc
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top