sustituir una parte de una palabra con expresiones regulares
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.
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> ! || !