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

标签 python regex beautifulsoup regex-negation

我正在使用 python 2.7 和 BeautifulSoup . 我需要找到诸如 abca.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/

相关文章:

python - 从两个列表中获取元素的所有组合?

javascript - 用于验证具有多个字母数字模式的字符串的正则表达式

regex - gsubfn : differences between perl and tclk?

javascript - 使用 BeautifulSoup 抓取跨度

python - 是否可以使用 python beautifulsoup 更改 html 元素的父级

python - 页面请求未完全加载

python - 我究竟做错了什么? Python 对象实例化保留先前实例化的数据?

python - cfnbootstrap 文件夹在哪里?

python - 数组函数返回空

regex - 如何使用 Perl 从纯文本中提取 URL?