¿Cómo ingresar una expresión regular en string.replace?
Necesito ayuda para declarar una expresión regular. Mis entradas son como las siguientes:
this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>.
and there are many other lines in the txt files
with<[3> such tags </[3>
La salida requerida es:
this is a paragraph with in between and then there are cases ... where the number ranges from 1-100.
and there are many other lines in the txt files
with such tags
He probado esto:
#!/usr/bin/python
import os, sys, re, glob
for infile in glob.glob(os.path.join(os.getcwd(), '*.txt')):
for line in reader:
line2 = line.replace('<[1> ', '')
line = line2.replace('</[1> ', '')
line2 = line.replace('<[1>', '')
line = line2.replace('</[1>', '')
print line
También probé esto (pero parece que estoy usando la sintaxis de expresiones regulares incorrecta):
line2 = line.replace('<[*> ', '')
line = line2.replace('</[*> ', '')
line2 = line.replace('<[*>', '')
line = line2.replace('</[*>', '')
No quiero codificar replace
del 1 al 99.
Este fragmento probado debería hacerlo:
import re
line = re.sub(r"</?\[\d+>", "", line)
Editar: aquí hay una versión comentada que explica cómo funciona:
line = re.sub(r"""
(?x) # Use free-spacing mode.
< # Match a literal '<'
/? # Optionally match a '/'
\[ # Match a literal '['
\d+ # Match one or more digits
> # Match a literal '>'
""", "", line)
¡ Las expresiones regulares son divertidas! Pero recomiendo encarecidamente dedicar una o dos horas a estudiar los conceptos básicos. Para empezar, necesita aprender qué caracteres son especiales: "metacaracteres" que deben tener caracteres de escape (es decir, con una barra invertida delante, y las reglas son diferentes dentro y fuera de las clases de caracteres). Hay un excelente tutorial en línea en: www .expresiones-regulares.info . El tiempo que pase allí se amortizará muchas veces. ¡Feliz expresión regular!
str.replace()
hace reemplazos fijos. Úselo re.sub()
en su lugar.
Yo diría esto (la expresión regular se explica en los comentarios):
import re
# If you need to use the regex more than once it is suggested to compile it.
pattern = re.compile(r"</{0,}\[\d+>")
# <\/{0,}\[\d+>
#
# Match the character “<” literally «<»
# Match the character “/” literally «\/{0,}»
# Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «{0,}»
# Match the character “[” literally «\[»
# Match a single digit 0..9 «\d+»
# Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
# Match the character “>” literally «>»
subject = """this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>.
and there are many other lines in the txt files
with<[3> such tags </[3>"""
result = pattern.sub("", subject)
print(result)
Si desea obtener más información sobre las expresiones regulares, le recomiendo leer el Libro de cocina de expresiones regulares de Jan Goyvaerts y Steven Levithan.
La forma más fácil
import re
txt='this is a paragraph with<[1> in between</[1> and then there are cases ... where the<[99> number ranges from 1-100</[99>. and there are many other lines in the txt files with<[3> such tags </[3>'
out = re.sub("(<[^>]+>)", '', txt)
print out
El método de reemplazo de objetos de cadena no acepta expresiones regulares sino solo cadenas fijas (consulte la documentación: http://docs.python.org/2/library/stdtypes.html#str.replace ).
Tienes que usar re
el módulo:
import re
newline= re.sub("<\/?\[[0-9]+>", "", line)