python3 - findall python re
Expresión regular para encontrar un acrónimo y evitar palabras compuestas por ese patrón (1)
Estoy usando Python 2.7 y BeautifulSoup . Necesito encontrar un acrónimo como abc o abc y evitar los falsos positivos como qweabcrty . El patrón puede estar al principio de la cadena, al final, puede tener espacio, comillas, comillas dobles, guiones (y así sucesivamente) justo antes y después, pero no un carácter alfanumérico.
Vengo a esta expresión regular
[^/w]?a/.?b/.?c/.?[^/w]?
Eso está bien para
- a B C
- a B C
- bla (abc)
- abc-blah
- bla-abc
- bla, bla, bla
- bla-abc-blah
Pero también se encuentra (y no quiero):
- qweabcrty
Si elimino el ? después de ambos [^ / w] ya no encontrará el caso 1, 2, 4 y 5, porque espera encontrar algo antes y / o después.
Para resumir, cómo puedo especificar esto: abc puede ser cualquier cosa en la cadena PERO SI hay un personaje antes y / o después no debe ser un alfanumérico.
El código python se ve así:
import re
from bs4 import BeautifulSoup, SoupStrainer
html = """
<html>
<a>abc</a>
<a>a.b.c.</a>
<a>blah (abc)</a>
<a>abc-blah</a>
<a>blah-abc</a>
<a>blah abc blah</a>
<a>blah-abc-blah</a>
<a>qweabcrty</a>
</html>"""
links = BeautifulSoup(html, "lxml", parse_only=SoupStrainer(["a"]))
tags = links.find_all("a", text = re.compile("[^/w]?a/.?b/.?c/.?[^/w]?", re.I))
print tags
Intenta usar el metacaracter de la palabra límite ( /b
):
html = """
<html>
<a>abc</a>
<a>a.b.c.</a>
<a>blah (abc)</a>
<a>abc-blah</a>
<a>blah-abc</a>
<a>blah abc blah</a>
<a>blah-abc-blah</a>
<a>qweabcrty</a>
</html>"""
import re
print re.sub(r''/b(abc|a/./b./.c)/b'', ''@@@'', html)
huellas dactilares
<html>
<a>@@@</a>
<a>@@@.</a>
<a>blah (@@@)</a>
<a>@@@-blah</a>
<a>blah-@@@</a>
<a>blah @@@ blah</a>
<a>blah-@@@-blah</a>
<a>qweabcrty</a>
</html>