0

如何使用 RE 模块查找除标签中的单词之外的所有单词?

我知道如何找到一些东西,但是如何以相反的方式去做呢?就像我写了一些要搜索的东西,但实际上我想搜索除标签和标签本身之外的所有单词之外的每个单词?

到目前为止,我管理了这个:

f = open (filename,'r')
data = re.findall(r"<.+?>", f.read())

好吧,它会打印<>标签内的所有内容,但是如何让它找到除了这些标签内的所有单词?我试过^, 在里面模式的开头使用[],但是符号按.字面意思处理,没有特殊含义。我也设法解决了这个问题,方法是拆分字符串,使用'''\= <>"''',然后检查整个字符串中<>标签内的单词(如 align、right、td 等),并将不在 <> 标签内的单词附加到另一个列表中。但这有点丑陋的解决方案。

<>除了里面的任何东西和这些标签本身之外,有没有一些简单的方法来搜索每个单词?因此,假设'hello 123 <b>Bold</b> <p>end</p>' 带有re.findall, 的字符串将返回:

['hello', '123', 'Bold', 'end']
4

4 回答 4

2

对这种任务使用正则表达式并不是最好的主意,因为你不能让它适用于所有情况。

应该抓住大多数此类词的解决方案之一是正则表达式模式

\b\w+\b(?![^<]*>)
于 2012-10-29T12:10:25.190 回答
2

如果你想避免使用正则表达式,BeautifulSoup可以很容易地从 HTML 文档中获取文本:

from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup(html_string)
text = "".join(soup.findAll(text=True))

从那里,你可以得到单词列表split

words = text.split()
于 2012-10-29T12:12:40.147 回答
1

类似的东西re.compile(r'<[^>]+>').sub('', string).split()应该可以解决问题。

您可能想阅读这篇关于使用正则表达式处理上下文无关语言的文章。

于 2012-10-29T12:04:25.597 回答
0

去掉所有标签(使用你原来的正则表达式),然后匹配单词。

唯一的弱点是字符串中是否有<s 而不是标记分隔符,或者 HTML 格式不正确。在这种情况下,最好使用 HTML 解析器。

于 2012-10-29T12:07:29.670 回答