836 Stimmen

Beste Methode zum Entfernen von Interpunktionszeichen aus einer Zeichenkette

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?

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.

1voto

Bob Kline Punkte 186

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

1 Stimmen

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.

1 Stimmen

@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.

0voto

Rajan saha Raju Punkte 678

Berücksichtigung von Unicode. Code geprüft in Python3.

from unicodedata import category
text = 'hi, how are you?'
text_without_punc = ''.join(ch for ch in text if not category(ch).startswith('P'))

0voto

mohannatd Punkte 31

Sie können auch dies tun:

import string
' '.join(word.strip(string.punctuation) for word in 'text'.split())

0voto

Wiktor Stribiżew Punkte 551798

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

-1voto

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.com

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.

Powered by:

X