3

我正在使用 python 2.7 和BeautifulSoup。我需要找到诸如abcabc之类的首字母缩写词,并避免像qweabcrty这样的误报。模式可以在字符串的开头,结尾,可以在前后有空格、引号、双引号、连字符(等等),但不能是字母数字字符。

我来这个正则表达式

[^\w]?a\.?b\.?c\.?[^\w]?

没关系

  • 美国广播公司
  • 美国广播公司
  • 废话(美国广播公司)
  • abc-blah
  • 废话ABC
  • 胡说八道
  • 废话-abc-废话

但它也被发现(我不想):

  • qweabcrty

如果我删除? 在两个[^\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
4

1 回答 1

3

尝试使用单词边界 ( \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>
于 2012-10-31T09:52:48.083 回答