Es scheint einen einfacheren Weg zu geben als:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
Gibt es eine?
Es scheint einen einfacheren Weg zu geben als:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
Gibt es eine?
Anscheinend kann ich keine Änderungen an der ausgewählten Antwort vornehmen, daher hier ein Update, das für Python 3 funktioniert. Die translate
ist immer noch die effizienteste Option, wenn es um nicht-triviale Transformationen geht.
Der Dank für die ursprüngliche schwere Arbeit geht an @Brian oben. Und Dank an @ddejohn für seinen ausgezeichneten Vorschlag zur Verbesserung des ursprünglichen Tests.
#!/usr/bin/env python3
"""Determination of most efficient way to remove punctuation in Python 3.
Results in Python 3.8.10 on my system using the default arguments:
set : 51.897
regex : 17.901
translate : 2.059
replace : 13.209
"""
import argparse
import re
import string
import timeit
parser = argparse.ArgumentParser()
parser.add_argument("--filename", "-f", default=argparse.__file__)
parser.add_argument("--iterations", "-i", type=int, default=10000)
opts = parser.parse_args()
with open(opts.filename) as fp:
s = fp.read()
exclude = set(string.punctuation)
table = str.maketrans("", "", string.punctuation)
regex = re.compile(f"[{re.escape(string.punctuation)}]")
def test_set(s):
return "".join(ch for ch in s if ch not in exclude)
def test_regex(s): # From Vinko's solution, with fix.
return regex.sub("", s)
def test_translate(s):
return s.translate(table)
def test_replace(s): # From S.Lott's solution
for c in string.punctuation:
s = s.replace(c, "")
return s
opts = dict(globals=globals(), number=opts.iterations)
solutions = "set", "regex", "translate", "replace"
for solution in solutions:
elapsed = timeit.timeit(f"test_{solution}(s)", **opts)
print(f"{solution:<10}: {elapsed:6.3f}")
Diese Tests sind wirklich nicht sehr aussagekräftig. Der Vollständigkeit halber sollten Sie Tests für größere Eingabestrings hinzufügen, z. B. für eine einige KB große Textdatei. Die str.translate
zieht ziemlich schnell nach vorne, da s
wächst.
@ddejohn Hervorragendes Argument. Meine ursprüngliche Absicht war es, den Benutzern zu antworten, die frustriert waren, weil sie nicht herausfinden konnten, wie sie @Brians ursprüngliches Skript unter Python 3.x zum Laufen bringen, aber ich kann sehen, dass Ihr Vorschlag den Wert seines ursprünglichen Tests erheblich verbessert. Und in der Tat, sogar replace
schlägt aus regex
wenn der Test auf diese Weise hochskaliert wird, und zwar mit deutlichem Abstand.
Wenn Sie mit Unicode-Zeichenfolgen arbeiten, empfehle ich die Verwendung von PyPi regex
Modul weil es sowohl Unicode-Eigenschaftsklassen (wie \p{X}
/ \P{X}
) und POSIX-Zeichenklassen (wie [:name:]
).
Installieren Sie das Paket einfach durch Eingabe von pip install regex
(oder pip3 install regex
) in Ihrem Terminal und drücken Sie ENTER.
Wenn Sie Interpunktion und Symbole jeglicher Art (d. h. alles außer Buchstaben, Ziffern und Leerzeichen) entfernen müssen, können Sie
regex.sub(r'[\p{P}\p{S}]', '', text) # to remove one by one
regex.sub(r'[\p{P}\p{S}]+', '', text) # to remove all consecutive punctuation/symbols with one go
regex.sub(r'[[:punct:]]+', '', text) # Same with a POSIX character class
Siehe eine Python-Demo online :
import regex
text = ' India <><>^$.,,! 002'
new_text = regex.sub(r'[\p{P}\p{S}\s]+', ' ', text).lower().strip()
# OR
# new_text = regex.sub(r'[[:punct:]\s]+', ' ', text).lower().strip()
print(new_text)
# => india 002
Hier habe ich ein Leerzeichen eingefügt \s
Muster zur Zeichenklasse
Entfernen von Stoppwörtern aus einer Textdatei mit Python
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')
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
4 Stimmen
Das scheint mir ziemlich einfach zu sein. Warum wollen Sie es ändern? Wenn Sie es einfacher haben wollen, verpacken Sie einfach, was Sie gerade geschrieben haben, in eine Funktion.
3 Stimmen
Nun, es schien nur ein bisschen hackish zu sein, mit Art von einem Nebeneffekt von str.translate, um die Arbeit zu tun. Ich dachte, es könnte etwas mehr wie str.strip(chars), die auf die gesamte Zeichenfolge anstelle von nur die Grenzen, die ich verpasst hatte gearbeitet werden.
2 Stimmen
Das hängt auch von den Daten ab. Die Verwendung bei Daten, die Servernamen mit Unterstrichen als Teil des Namens enthalten (was an manchen Orten recht häufig vorkommt), könnte schlecht sein. Seien Sie sicher, dass Sie die Daten kennen und wissen, was sie enthalten, oder Sie könnten am Ende mit einer Teilmenge des Problems clbuttic.
65 Stimmen
Es kommt auch darauf an, was Sie als Interpunktion bezeichnen. "
The temperature in the O'Reilly & Arbuthnot-Smythe server's main rack is 40.5 degrees.
" enthält genau EIN Interpunktionszeichen, das zweite ".45 Stimmen
Ich bin überrascht, dass das noch niemand erwähnt hat.
string.punctuation
enthält überhaupt keine nicht-englischen Satzzeichen. Ich denke an ×"", und so weiter.2 Stimmen
Funktioniert nicht mit einer Unicode-Zeichenkette?
2 Stimmen
@JohnMachin du vergisst, dass
' '
ist Zeichensetzung .2 Stimmen
Ab Python 3.1 (bis mindestens 3.8.3), werden Sie wollen:
str.maketrans("","", string.punctuation)
per diese Dokumentation mit der Änderung dokumentiert in 3.10 Stimmen
Die meisten Diskussionen hier betreffen Python 2, diese Frage ist ähnlich hat aber bessere Antworten als Python 3.
0 Stimmen
Ich habe die Lösung nicht gesehen
s.strip(string.punctuation)
; beantwortet das nicht die Frage? Was übersehe ich?0 Stimmen
Es ist unklar, was das Problem/die Qualifikationen hier sind; daher ist diese Frage derzeit nicht themenbezogen. Was ist an der angewandten Methode nicht einfach genug? Bitte klären Sie sachlich, was Sie daran für zu komplex halten. Ist eine Zeile zu viel? Ist es die Anzahl der dafür erforderlichen Funktionen? Ist es eine bestimmte Funktion, die Sie lieber vermeiden würden? Etc.
0 Stimmen
@Clément Hier ist eine gute Unicode-bewusste Antwort
0 Stimmen
@Brownbat Und mit Python 3 meinen Sie "Unicode-fähig". Mein vorheriger Kommentar verweist auf eine Antwort auf diese Frage, die Unicode-fähig ist und sowohl die Unicode-Kategorien "S" (Symbole) und "P" (Interpunktion) erwähnt.