如何使用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']
答案 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解析器。