Parece que deve haver uma maneira mais simples do que:
import string
s = "string. With. Punctuation?" # Sample string
out = s.translate(string.maketrans("",""), string.punctuation)
Existe?
python
string
punctuation
Lawrence Johnston
fonte
fonte
The temperature in the O'Reilly & Arbuthnot-Smythe server's main rack is 40.5 degrees.
" contém exatamente UM caractere de pontuação, o segundo "."string.punctuation
não inclui pontuação que não seja do inglês. Estou pensando em : ,!?: × “” 〟e assim por diante.Respostas:
Do ponto de vista da eficiência, você não vai vencer
Para versões superiores do Python, use o seguinte código:
Ele está executando operações de cadeia bruta em C com uma tabela de pesquisa - não há muito que supere isso, mas escrevendo seu próprio código C.
Se a velocidade não é uma preocupação, outra opção é:
Isso é mais rápido que o s.replace com cada caractere, mas não terá um desempenho tão bom quanto as abordagens python não puras, como regexes ou string.translate, como você pode ver nos intervalos abaixo. Para esse tipo de problema, fazê-lo no nível mais baixo possível compensa.
Código de tempo:
Isso fornece os seguintes resultados:
fonte
table = string.maketrans("","")
deve ser substituído portable = str.maketrans({key: None for key in string.punctuation})
?regex
agora é o método mais eficiente! É quase duas vezes mais rápido que traduzir. Além disso, conjuntos e substituições não são mais tão ruins! Ambos são melhorou em mais de um fator de 4 :)Expressões regulares são bastante simples, se você as conhece.
fonte
s = re.sub(r'[^\w\s]','',s, re.UNICODE)
. Testando-o com python 3 no linux, ele funciona mesmo sem a bandeira usando letras tamil, தமிழ்.Para maior comodidade do uso, resumi a nota de pontuação de striping de uma string no Python 2 e no Python 3. Consulte outras respostas para a descrição detalhada.
Python 2
Python 3
fonte
fonte
str
no Python 3 eunicode
no Python 2, odeletechars
argumento não é suportado.TypeError: translate() takes exactly one argument (2 given)
:(Eu costumo usar algo como isto:
fonte
reduce(lambda s,c: s.replace(c, ''), string.punctuation, s)
.string.punctuation
é apenas ASCII ! Uma maneira mais correta (mas também muito mais lenta) é usar o módulo unicodedata:Você também pode generalizar e remover outros tipos de caracteres:
Ele também tira caracteres como os
~*+§$
que podem ou não ser "pontuação", dependendo do ponto de vista de alguém.fonte
regex.sub(ur"\p{P}+", "", text)
~
não fazem parte da categoria de pontuação. Você também precisa testar a categoria Símbolos.Não necessariamente mais simples, mas de uma maneira diferente, se você estiver mais familiarizado com a nova família.
fonte
Para valores do Python 3
str
ou Python 2unicode
,str.translate()
é necessário apenas um dicionário; codepoints (inteiros) são pesquisados nesse mapeamento e qualquer coisa mapeada paraNone
é removida.Para remover (alguma?) Pontuação, use:
O
dict.fromkeys()
método de classe torna trivial a criação do mapeamento, configurando todos os valores comNone
base na sequência de chaves.Para remover toda a pontuação, não apenas a pontuação ASCII, sua tabela precisa ser um pouco maior; veja a resposta de JF Sebastian (versão Python 3):
fonte
string.punctuation
não é suficiente. Veja minha respostaunicode
objetos vs. objetos Python 2str
.string.punctuation
perde muitos sinais de pontuação que são comumente usados no mundo real. Que tal uma solução que funcione para pontuação não-ASCII?Pessoalmente, acredito que esta é a melhor maneira de remover pontuação de uma string em Python porque:
\{S}
se quiser remover a pontuação, mas manter símbolos como$
.\{Pd}
, removerá apenas traços.Isso usa propriedades de caracteres Unicode, sobre as quais você pode ler mais na Wikipedia .
fonte
Ainda não vi essa resposta. Basta usar uma regex; remove todos os caracteres, além dos caracteres da palavra (
\w
) e dos caracteres numéricos (\d
), seguidos por um caractere de espaço em branco (\s
):fonte
\d
é redundante, pois é um subconjunto de\w
.\w
na documentação: docs.python.org/3/library/re.htmlAqui está uma linha para Python 3.5:
fonte
Esta pode não ser a melhor solução, mas foi assim que eu fiz.
fonte
Aqui está uma função que escrevi. Não é muito eficiente, mas é simples e você pode adicionar ou remover qualquer pontuação que desejar:
fonte
fonte
Apenas como uma atualização, reescrevi o exemplo @Brian no Python 3 e fiz alterações nele para mover a etapa de compilação regex para dentro da função. Meu pensamento aqui era o tempo de cada passo necessário para fazer a função funcionar. Talvez você esteja usando computação distribuída e não possa ter o objeto regex compartilhado entre seus trabalhadores e precise ter
re.compile
etapas em cada trabalhador. Além disso, eu estava curioso para cronometrar duas implementações diferentes de maketrans para Python 3vs
Além disso, adicionei outro método para usar set, onde aproveito a função de interseção para reduzir o número de iterações.
Este é o código completo:
Estes são os meus resultados:
fonte
fonte
Aqui está uma solução sem regex.
fonte
Um one-liner pode ser útil em casos não muito rigorosos:
fonte
fonte
fonte
Por que nenhum de vocês usa isso?
Muito devagar?
fonte
Considerando unicode. Código verificado no python3.
fonte
Remova as palavras de parada do arquivo de texto usando Python
fonte
Eu gosto de usar uma função como esta:
fonte
abc.strip(string.punctuation)
vez disso. Não removerá esses caracteres no meio .