Python正则表达式跳过前几个字符?
嘿,我有一个关于正则表达式的简单问题。我想要提取出
标签里面的文本,包括标签本身。我知道我现在的写法不对,因为它会把标签之前的所有字符也匹配上。我想知道你们是怎么跳过那些内容的?x = re.match('(.*<body).*?(</body>)', fileString)
谢谢!
6 个回答
0
你不能用正则表达式来解析HTML。因为HTML不是一种普通的语言。建议你使用像lxml这样的HTML解析器。
9
我不太懂Python,不过这里有个简单的例子,是用Beautiful Soup写的。这是一个常被推荐用来解析HTML的工具。
import BeautifulSoup
soup = BeautifulSoup(fileString)
bodyTag = soup.html.body.string
理论上,这个工具可以处理HTML中的各种复杂情况。用纯正则表达式来解决这些问题很难,因为正则表达式并不是为了处理HTML而设计的。
2
这里有一段示例代码,它使用正则表达式来找到所有在<body>...</body>
标签之间的文本。虽然这展示了Python的re模块的一些功能,但要注意,如果你打算解析HTML或XML,Beautiful Soup模块非常简单易用,是更好的选择。(下面会有一个使用BeautifulSoup解析的示例。)
#!/usr/bin/env python
import re
# Here we have a string with a multiline <body>...</body>
fileString='''baz<body>foo
baby foo
baby foo
baby foo
</body><body>bar</body>'''
# re.DOTALL tells re that '.' should match any character, including newlines.
x = re.search('(<body>.*?</body>)', fileString, re.DOTALL)
for match in x.groups():
print(match)
# <body>foo
# baby foo
# baby foo
# baby foo
# </body>
如果你想收集所有匹配的结果,可以使用re.findall:
print(re.findall('(<body>.*?</body>)', fileString, re.DOTALL))
# ['<body>foo\nbaby foo\nbaby foo\nbaby foo\n</body>', '<body>bar</body>']
如果你打算多次使用这个模式,可以先编译它:
pat=re.compile('(<body>.*?</body>)', re.DOTALL)
print(pat.findall(fileString))
# ['<body>foo\nbaby foo\nbaby foo\nbaby foo\n</body>', '<body>bar</body>']
下面是如何使用BeautifulSoup来完成这个任务:
#!/usr/bin/env python
from BeautifulSoup import BeautifulSoup
fileString='''baz<body>foo
baby foo
baby foo
baby foo
</body><body>bar</body>'''
soup = BeautifulSoup(fileString)
print(soup.body)
# <body>foo
# baby foo
# baby foo
# baby foo
# </body>
print(soup.findAll('body'))
# [<body>foo
# baby foo
# baby foo
# baby foo
# </body>, <body>bar</body>]