Pregunta

¿Cómo eliminar <ref> *some text*</ref> texto dentro junto con ref sí?

en '...and so on<ref>Oxford University Press</ref>.'

re.sub(r'<ref>.+</ref>', '', string) sólo elimina si <ref> <ref> es seguido por un espacio en blanco

EDIT:? que tiene que ver con algo bajo límites de las palabras supongo ... o

Edit2 Lo que necesito es que lo hará el último matemáticas </ref> (cierre) incluso si se trata de una nueva línea.

¿Fue útil?

Solución

Yo realmente no se ve problema, debido a que el código pegado eliminará la parte <ref>...</ref> de la cadena. Pero si lo que quiere decir es que la etiqueta ref y vacío no se elimina:

re.sub(r'<ref>.+</ref>', '', '...and so on<ref></ref>.')

A continuación, lo que hay que hacer es cambiar el. + Con. *

Un medio de uno o más, mientras que los medios * cero o más.

http://docs.python.org/library/re.html :

'.' (Dot.) In the default mode, this matches any character except a newline.
    If the DOTALL flag has been specified, this matches any character including
    a newline.
'*' Causes the resulting RE to match 0 or more repetitions of the preceding
    RE, as many repetitions as are possible. ab* will match ‘a’, ‘ab’, or ‘a’
    followed by any number of ‘b’s.
'+' Causes the resulting RE to match 1 or more repetitions of the preceding
    RE. ab+ will match ‘a’ followed by any non-zero number of ‘b’s; it will
    not match just ‘a’.
'?' Causes the resulting RE to match 0 or 1 repetitions of the preceding RE.
    ab? will match either ‘a’ or ‘ab’.

Otros consejos

Se podría hacer una expresión regular de fantasía para hacer precisamente lo que se propone, pero hay que usar dotall y de búsqueda no expansivo, y hay que entender cómo funcionan las expresiones regulares en general, que no lo hace.

Su mejor opción es utilizar métodos de cadena en lugar de expresiones regulares, que es de todos modos más Pythonic:

while '<reg>' in string:
    begin, end = string.split('<reg>', 1)
    trash, end = end.split('</reg>', 1)
    string = begin + end

Si quieres ser muy genérico, permitiendo extraña capitalización de las etiquetas o espacios en blanco y las propiedades de las etiquetas, usted no debe hacer esto tampoco, pero invertir en el aprendizaje de una biblioteca html / xml análisis. lxml actualmente parece estar ampliamente recomendado y bien apoyado.

Es posible que desee tener cuidado de no eliminar una gran cantidad de texto sólo porque hay más de un </ref>s cierre. A continuación la expresión regular sería más exacto en mi opinión:

r'<ref>[^<]*</ref>'

Esto evitaría la coincidencia 'codicioso'.

Por cierto: Hay una gran herramienta llamada la expresión regular entrenador para analizar y probar sus expresiones regulares. Lo puedes encontrar en: http://www.weitz.de/regex-coach/

edit: se olvidó de agregar la etiqueta de código en el primer párrafo

.

Si intenta hacer esto con expresiones regulares que se encontrará con un mundo de problemas . Usted está efectivamente tratando de analizar algo, pero el analizador no está a la altura.

a juego con avidez a través de cadenas probablemente se come demasiado, como en este ejemplo:

<ref>SDD</ref>...<ref>XX</ref>

acabaría cleraning de seguridad de todo el centro.

¿De verdad quieres un programa de análisis, algo así como sopa Hermosa .

from BeautifulSoup import BeautifulSoup, Tag
s = "<a>sfsdf</a> <ref>XX</ref> || <ref>YY</ref>"
soup = BeautifulSoup(s)
x = soup.findAll("ref")
for z in x:
  soup.ref.replaceWith('!')
soup # <a>sfsdf</a> ! || !
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top