una separar reemplazar por funcion especiales eliminar contar comparar caracteres caracter cadenas cadena python string punctuation

reemplazar - python separar string por caracter



La mejor manera de quitar la puntuación de una cadena en Python (24)

Parece que debería haber una manera más simple que:

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

¿Esta ahí?


Aquí hay una función que escribí. No es muy eficiente, pero es simple y puede agregar o eliminar cualquier puntuación que desee:

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


Aquí hay una sola línea para 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}))


Aquí hay una solución sin expresiones regulares.

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

  • Reemplaza las puntuaciones con espacios.
  • Reemplaza múltiples espacios entre palabras con un solo espacio
  • Retire los espacios finales, si hay alguno con la tira ()

Así es como cambiamos nuestros documentos a mayúsculas o minúsculas.

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


Busque y reemplace usando las funciones regex, como se ve here. . Si tiene que realizar la operación repetidamente, puede mantener una copia compilada del patrón de expresiones regulares (su puntuación), lo que acelerará un poco las cosas.


Desde una perspectiva de eficiencia, no vas a vencer

s.translate(None, string.punctuation)

Está realizando operaciones de cadena sin formato en C con una tabla de búsqueda; no hay mucho que pueda superar eso, pero escribir su propio código C.

Si la velocidad no es una preocupación, otra opción es:

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

Esto es más rápido que en cada caso con cada carácter, pero no funcionará tan bien como los enfoques de Python no puros como regexes o string.translate, como puede ver en los horarios de abajo. Para este tipo de problema, hacerlo en el nivel más bajo posible da sus frutos.

Código de tiempo:

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)

Esto da los siguientes resultados:

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


Elimine las palabras de parada del archivo de texto usando 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'')


Esta podría no ser la mejor solución, sin embargo, así es como lo hice.

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


Las expresiones regulares son bastante simples, si las conoces.

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


Me gusta usar una función como esta:

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


No he visto esta respuesta todavía. Sólo tiene que utilizar un regex; elimina todos los caracteres además de los caracteres de palabras ( /w ) y números ( /d ), seguidos de un carácter de espacio en blanco ( /s ):

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


No necesariamente más simple, sino de una manera diferente, si está más familiarizado con la familia.

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


Para la conveniencia de su uso, resumo la nota de puntuación de una cadena tanto en Python 2 como en Python 3. Consulte otras respuestas para obtener una descripción detallada.

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


Para los valores de Python 3 str o Python 2 unicode , str.translate() solo toma un diccionario; Los puntos de código (enteros) se buscan en esa asignación y todo lo que se asigna a None se elimina.

Para quitar la puntuación (¿algunos?) Entonces, use:

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

El método de clase dict.fromkeys() hace que sea trivial crear el mapeo, estableciendo todos los valores en None función de la secuencia de teclas.

Para eliminar toda puntuación, no solo la puntuación ASCII, su tabla debe ser un poco más grande; Vea la respuesta de JF Sebastian (versión Python 3):

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


Solo como una actualización, reescribí el ejemplo @Brian en Python 3 e hice cambios para mover el paso de compilación de expresiones regulares dentro de la función. Mi pensamiento aquí fue programar cada paso necesario para que la función funcione. Quizás esté utilizando la computación distribuida y no pueda compartir objetos de re.compile regulares entre sus trabajadores y necesita tener re.compile paso de re.compile en cada trabajador. Además, tenía curiosidad por cronometrar dos implementaciones diferentes de maketrans para Python 3

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

vs

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

Además, agregué otro método para usar set, donde aprovecho la función de intersección para reducir el número de iteraciones.

Este es el código completo:

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

Estos son mis resultados:

sets : 3.1830138750374317 sets2 : 2.189873124472797 regex : 7.142953420989215 translate : 4.243278483860195 translate2 : 2.427158243022859 replace : 4.579746678471565


Un one-liner podría ser útil en casos no muy estrictos:

''''.join([c for c in s if c.isalnum() or c.isspace()])


Usualmente uso algo como esto:

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


string.punctuation es ASCII solamente ! Una forma más correcta (pero también mucho más lenta) es utilizar el módulo unicodedata:

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


string.punctuation pierde cargas de signos de puntuación que se usan comúnmente en el mundo real. ¿Qué tal una solución que funcione para la puntuación no ASCII?

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

Personalmente, creo que esta es la mejor manera de eliminar la puntuación de una cadena en Python porque:

  • Se elimina toda la puntuación de Unicode.
  • Es fácilmente modificable, por ejemplo, puede eliminar la /{S} si desea eliminar la puntuación, pero mantenga símbolos como $ .
  • Puede ser realmente específico sobre lo que desea conservar y lo que desea eliminar, por ejemplo, /{Pd} solo eliminará los guiones.
  • Este regex también normaliza los espacios en blanco. Asigna pestañas, retornos de carro y otras rarezas a espacios simples y agradables.

Esto utiliza propiedades de caracteres Unicode, sobre las que puede leer más en Wikipedia .


#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


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


myString.translate(None, string.punctuation)


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