嘿,我有一个关于正则表达式的相当基本的问题。我想只返回body(包括)body标签中的文本,我知道以下是不对的,因为它也会匹配开始body标签之前的所有字符。我想知道你怎么去跳过那些?

x = re.match('(.*<body).*?(</body>)', fileString)

谢谢!

有帮助吗?

解决方案

以下是一些示例代码,它使用正则表达式查找<body>...</body>标记之间的所有文本。虽然这展示了python的re模块的一些功能,但请注意 Beautiful Soup 模块非常容易使用,如果您计划解析HTML或XML,它是一个更好的工具。 (有关如何使用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>]

其他提示

我不懂Python,但这是一个使用美丽的汤,我经常看到推荐用于Python HTML解析。

import BeautifulSoup

soup = BeautifulSoup(fileString)

bodyTag = soup.html.body.string

那将(理论上)处理HTML的所有复杂性,这对于基于纯正则表达式的答案来说非常困难,因为它不是正则表达式的设计目标。

您无法使用正则表达式解析HTML。 HTML不是常规语言。请使用像lxml这样的HTML解析器。

 x = re.match('.*(<body>.*?</body>)', fileString)

考虑使用minidom进行HTML解析。

x = re.search('(<body>.*</body>)', fileString)
x.group(1)

比匹配答案少打字

你的fileString是否包含多行?在这种情况下,您可能需要指定它或明确跳过这些行:

x = re.match(r"(?:.|\n)*(<body>(?:.|\n)*</body>)", fileString)

或更简单地使用re模块:

x = re.match(r".*(<body>.*</body>)", fileString, re.DOTALL)
如果x不是None,

x.groups()[0]应该包含你的字符串。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top