Wydaje się, że powinien istnieć prostszy sposób niż:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
Jest tu?
python
string
punctuation
Lawrence Johnston
źródło
źródło
The temperature in the O'Reilly & Arbuthnot-Smythe server's main rack is 40.5 degrees.
” zawiera dokładnie JEDEN znak interpunkcyjny, drugi „”.string.punctuation
nikt nie wspomniał, że w ogóle nie zawiera interpunkcji w języku innym niż angielski. Myślę o。 ,!? : × „” 〟i tak dalej.Odpowiedzi:
Z punktu widzenia wydajności nie pokonasz
W przypadku wyższych wersji Pythona użyj następującego kodu:
Wykonuje operacje na surowym łańcuchu znaków w C z tabelą odnośników - niewiele to przebije, ale napisanie własnego kodu C.
Jeśli prędkość nie stanowi problemu, inną opcją jest:
Jest to szybsze niż s.replace z każdym char, ale nie działa tak dobrze, jak nie-czyste podejście do pythona, takie jak wyrażenia regularne lub string.translate, jak widać z poniższych czasów. W przypadku tego typu problemu robienie tego na jak najniższym poziomie się opłaca.
Kod czasowy:
Daje to następujące wyniki:
źródło
table = string.maketrans("","")
należy zastąpićtable = str.maketrans({key: None for key in string.punctuation})
?regex
jest teraz najbardziej wydajną metodą! To prawie 2x szybsze niż tłumaczenie. Także zestawy i zamień nie są już takie złe! Oba zostały poprawione ponad 4Wyrażenia regularne są dość proste, jeśli je znasz.
źródło
s = re.sub(r'[^\w\s]','',s, re.UNICODE)
. Testowanie go w Pythonie 3 na Linuksie działa nawet bez flagi przy użyciu liter tamilskich, தமிழ்.Dla wygody użytkowania podsumowuję notatkę usuwania interpunkcji z łańcucha zarówno w Pythonie 2, jak i Pythonie 3. Szczegółowy opis znajduje się w innych odpowiedziach.
Python 2
Python 3
źródło
źródło
str
w Pythonie 3 iunicode
Pythonie 2deletechars
argument nie jest obsługiwany.TypeError: translate() takes exactly one argument (2 given)
:(Zwykle używam czegoś takiego:
źródło
reduce(lambda s,c: s.replace(c, ''), string.punctuation, s)
.string.punctuation
jest tylko ASCII ! Bardziej poprawnym (ale także znacznie wolniejszym) sposobem jest użycie modułu unicodedata:Możesz uogólniać i usuwać także inne typy znaków:
Usunie także znaki,
~*+§$
które mogą, ale nie muszą być „znakami interpunkcyjnymi” w zależności od punktu widzenia.źródło
regex.sub(ur"\p{P}+", "", text)
~
nie należą do kategorii znaków interpunkcyjnych. Musisz także przetestować kategorię Symbole.Niekoniecznie prostsze, ale inny sposób, jeśli jesteś bardziej zaznajomiony z rodziną ponownie.
źródło
W przypadku wartości w języku Python 3
str
lub Python 2unicode
pobierany jeststr.translate()
tylko słownik; punkty kodowe (liczby całkowite) są wyszukiwane w tym odwzorowaniu i wszystko, na co mapowaneNone
jest usuwane.Aby usunąć (trochę?) Interpunkcję, użyj:
Metoda
dict.fromkeys()
klasy sprawia, że tworzenie mapowania jest banalne, a wszystkie wartości są ustawiane naNone
podstawie sekwencji kluczy.Aby usunąć wszystkie znaki interpunkcyjne, a nie tylko znaki interpunkcyjne ASCII, twoja tabela musi być nieco większa; patrz odpowiedź JF Sebastiana (wersja Python 3):
źródło
string.punctuation
nie wystarczy. Zobacz moją odpowiedźunicode
obiektów w porównaniu do obiektów Python 2str
.string.punctuation
brakuje wielu znaków interpunkcyjnych, które są powszechnie używane w prawdziwym świecie. Co powiesz na rozwiązanie, które działa w przypadku interpunkcji spoza ASCII?Osobiście uważam, że jest to najlepszy sposób na usunięcie interpunkcji z ciągu znaków w Pythonie, ponieważ:
\{S}
jeśli chcesz usunąć interpunkcję, ale zachowaj symbole jak$
.\{Pd}
usuniesz tylko myślniki.Wykorzystuje to właściwości znaków Unicode, o których więcej można przeczytać na Wikipedii .
źródło
Nie widziałem jeszcze tej odpowiedzi. Wystarczy użyć wyrażenia regularnego; usuwa wszystkie znaki oprócz znaków słownych (
\w
) i cyfr (\d
), a następnie białych znaków (\s
):źródło
\d
jest zbędny, ponieważ jest podzbiorem\w
.\w
w dokumentacji: docs.python.org/3/library/re.htmlOto jedna linijka dla Python 3.5:
źródło
To może nie być najlepsze rozwiązanie, ale tak właśnie to zrobiłem.
źródło
Oto funkcja, którą napisałem. To nie jest bardzo wydajne, ale jest proste i możesz dodać lub usunąć dowolną interpunkcję:
źródło
źródło
W ramach aktualizacji przepisałem przykład @Brian w Pythonie 3 i wprowadziłem w nim zmiany, aby przenieść krok kompilacji wyrażenia regularnego wewnątrz funkcji. Myślałem tutaj o tym, aby za każdym razem wykonać każdy krok potrzebny do działania tej funkcji. Być może używasz przetwarzania rozproszonego i nie możesz udostępnić obiektu wyrażenia regularnego między swoimi pracownikami i musisz mieć
re.compile
krok na każdym z nich. Byłem też ciekawy, kiedy zaplanowałem dwie różne implementacje maketrans dla Python 3vs
Dodatkowo dodałem kolejną metodę użycia zestawu, w której korzystam z funkcji przecięcia, aby zmniejszyć liczbę iteracji.
To jest kompletny kod:
To są moje wyniki:
źródło
źródło
Oto rozwiązanie bez wyrażenia regularnego.
źródło
Jednowarstwowy może być pomocny w niezbyt surowych przypadkach:
źródło
źródło
źródło
Dlaczego nikt z was tego nie używa?
Za wolno?
źródło
Biorąc pod uwagę Unicode. Kod sprawdzany w python3.
źródło
Usuń słowa stop z pliku tekstowego za pomocą Pythona
źródło
Lubię używać takiej funkcji:
źródło
abc.strip(string.punctuation)
zamiast tego do tego. Nie usunie takich postaci na środku .