Python - 正则表达式 - 查找除标签之外的每个单词

时间:2012-10-29 12:00:00

标签: python regex

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

我知道如何找到一些东西,但如何以相反的方式做到这一点?就像我写一些东西来搜索一样,但是我想要搜索除了标签和标签本身内的所有内容之外的所有单词?

到目前为止,我设法做到了:

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

那么它会打印<>标签内的所有内容,但如何让它找到除这些标签内的每个单词之外的所有单词? 我尝试^,在[]内的模式开头使用,但后来符号为.的字面上没有特殊含义。 我还设法通过使用'''\= <>"'''拆分字符串来解决这个问题,然后检查整个字符串中<>个标记内的单词(如align,right,td等),并附加不在里面的单词&LT;&GT;另一个列表中的标签。但那有点丑陋的解决方案。

除了<>内的任何内容以及这些标签本身之外,是否有一些简单的方法可以搜索每个单词? 所以说字符串'hello 123 <b>Bold</b> <p>end</p>' 使用re.findall,将返回:

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

4 个答案:

答案 0 :(得分:2)

使用正则表达式进行此类任务并不是最好的主意,因为您无法使其适用于所有情况。

应该捕获大多数此类单词的解决方案之一是正则表达式

\b\w+\b(?![^<]*>)

答案 1 :(得分:2)

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

from BeautifulSoup import BeautifulSoup

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

从那里,您可以获得split的单词列表:

words = text.split()

答案 2 :(得分:1)

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

您可能希望阅读有关使用正则表达式处理无上下文语言的this post

答案 3 :(得分:0)

删除所有标签(使用原始正则表达式),然后匹配单词。

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