¿Cómo ingresar una expresión regular en string.replace?

Resuelto alvas asked hace 13 años • 7 respuestas

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 replacedel 1 al 99.

alvas avatar Apr 14 '11 10:04 alvas
Aceptado

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!

ridgerunner avatar Apr 14 '2011 04:04 ridgerunner

str.replace()hace reemplazos fijos. Úselo re.sub()en su lugar.

Ignacio Vazquez-Abrams avatar Apr 14 '2011 04:04 Ignacio Vazquez-Abrams

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.

Lorenzo P avatar Jun 27 '2013 08:06 Lorenzo P

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
Ezequiel Marquez avatar May 14 '2013 16:05 Ezequiel Marquez

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 reel módulo:

import re
newline= re.sub("<\/?\[[0-9]+>", "", line)
Zac avatar May 16 '2013 10:05 Zac