我正在使用 python 2.7 和 BeautifulSoup . 我需要找到诸如 abc 或 a.b.c. 之类的首字母缩略词,并避免像 qweabcrty 这样的误报。模式可以在字符串的开头、结尾,前后可以有空格、引号、双引号、连字符(等等),但不能是字母数字字符。
我来到这个正则表达式
[^\w]?a\.?b\.?c\.?[^\w]?
没关系
- abc
- a.b.c.
- 废话(abc)
- abc-blah
- 废话
- 废话abc废话
- 废话-废话
但是也找到了(我不想):
- qweabcrty
如果我在 [^\w] 之后删除 ? 它将不再找到案例 1、2、4 和 5,因为它希望找到之前的内容和/或之后。
长话短说,我该如何指定: abc 可以是字符串中的任何位置 BUT IF 之前和/或之后的字符不能是字母数字字符。
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
最佳答案
尝试使用单词边界 (\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>
关于python - 用于查找首字母缩略词并避免由该模式组成的单词的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13155152/