我正在使用python 2.7和BeautifulSoup。 我需要找到一个缩写,例如 abc 或 a.b.c。,并避免像 qweabcrty 这样的误报。模式可以在字符串的开头,最后,可以在前后有空格,引号,双引号,连字符(等等),但不能包含字母数字字符。
我来到这个正则表达式
[^\w]?a\.?b\.?c\.?[^\w]?
可以
但它也被发现(我不想):
如果我在 [^ \ w] 之后删除?,它将不再找到案例1,2,4和5,因为它希望在之前找到一些东西和/或之后。
长话短说,我该如何指定: abc可以是字符串中的任何一个但是如果在它之前和/或之后有一个字符,它必须不是字母数字字符。
python代码如下:
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
答案 0 :(得分:3)
尝试使用单词boundary(\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)
打印
<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>