正则表达式,用于查找首字母缩略词并避免由该模式组成的单词

时间:2012-10-31 09:48:14

标签: python regex beautifulsoup regex-negation

我正在使用python 2.7和BeautifulSoup。 我需要找到一个缩写,例如 abc a.b.c。,并避免像 qweabcrty 这样的误报。模式可以在字符串的开头,最后,可以在前后有空格,引号,双引号,连字符(等等),但不能包含字母数字字符。

我来到这个正则表达式

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

可以
  • ABC
  • A.B.C。
  • blah(abc)
  • ABC-嗒嗒
  • 嗒嗒-ABC
  • blah abc blah
  • 嗒嗒-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

1 个答案:

答案 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>