python正则表达式中的多行匹配

python正则表达式中的多行匹配,python,Python,我想从html页面中提取标记之间的数据。我使用了下面的代码,但没有得到任何结果。标记之间的html是多行的 category =re.findall('<tr>(.*?)</tr>',data); category=re.findall(“(.*)”,数据); 请建议解决此问题。不要使用正则表达式解析HTML。使用HTML解析器,例如or.pat=re.compile(“(.*?”),re.DOTALL | re.M) 打印pat.findall(数据) 或非正则表

我想从html页面中提取
标记之间的数据。我使用了下面的代码,但没有得到任何结果。
标记之间的html是多行的

category =re.findall('<tr>(.*?)</tr>',data);
category=re.findall(“(.*)”,数据);

请建议解决此问题。

不要使用正则表达式解析HTML。使用HTML解析器,例如or.

pat=re.compile(“(.*?”),re.DOTALL | re.M)
打印pat.findall(数据)
或非正则表达式方式

for item in data.split("</tr>"):
    if "<tr>" in item:
       print item[item.find("<tr>")+len("<tr>"):]
用于数据中的项。拆分(“”):
如果项目中有“”:
打印项目[项目.查找(“”+len(“”):]

不要使用正则表达式,请使用HTML解析器,例如:

结果:

[<tr>bar</tr>, <tr>qux</tr>]
bar
qux

使用HTML解析器并不像听起来那么可怕!而且它的工作将比这里发布的任何正则表达式都更可靠。

正如其他人所建议的,您遇到的具体问题可以通过使用允许多行匹配来解决

然而,您正在经历一个危险的补丁解析过程。改为使用XML/HTML解析器,这非常有用

doc = """<table border="1">
    <tr>
        <td>row 1, cell 1</td>
        <td>row 1, cell 2</td>
    </tr>
    <tr>
        <td>row 2, cell 1</td>
        <td>row 2, cell 2</td>
    </tr>
</table>"""

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(doc)
all_trs = soup.findAll("tr")
doc=”“”
第1行,第1单元
第1行第2单元
第2行第1单元
第2行,第2单元
"""
从BeautifulSoup导入BeautifulSoup
汤=美汤(doc)
all_trs=soup.findAll(“tr”)

只是为了解决这个问题。尽管所有这些链接都指向
re.M
,但它在这里不起作用,因为只要浏览一下它的解释就会发现。如果不尝试解析html,您需要
re.S
,当然:

>>> doc = """<table border="1">
    <tr>
        <td>row 1, cell 1</td>
        <td>row 1, cell 2</td>
    </tr>
    <tr>
        <td>row 2, cell 1</td>
        <td>row 2, cell 2</td>
    </tr>
</table>"""

>>> re.findall('<tr>(.*?)</tr>', doc, re.S)
['\n        <td>row 1, cell 1</td>\n        <td>row 1, cell 2</td>\n    ', 
 '\n        <td>row 2, cell 1</td>\n        <td>row 2, cell 2</td>\n    ']
>>> re.findall('<tr>(.*?)</tr>', doc, re.M)
[]
>>doc=”“”
第1行,第1单元
第1行第2单元
第2行第1单元
第2行,第2单元
"""
>>>关于findall(“(.*?”,文件,关于S)
['\n第1行,第1单元格\n第1行,第2单元格\n',
'\n第2行,单元格1\n第2行,单元格2\n']
>>>关于findall(“(.*?”,文件,关于M)
[]
阅读文档:或上面的一段:)@Tomasz:但一定要阅读页眉以外的内容;)
re.findall(“(?”),doc,re.S)
也可以写成
re.findall(“(?)(*?”,doc)
bar
qux
doc = """<table border="1">
    <tr>
        <td>row 1, cell 1</td>
        <td>row 1, cell 2</td>
    </tr>
    <tr>
        <td>row 2, cell 1</td>
        <td>row 2, cell 2</td>
    </tr>
</table>"""

from BeautifulSoup import BeautifulSoup
soup = BeautifulSoup(doc)
all_trs = soup.findAll("tr")
>>> doc = """<table border="1">
    <tr>
        <td>row 1, cell 1</td>
        <td>row 1, cell 2</td>
    </tr>
    <tr>
        <td>row 2, cell 1</td>
        <td>row 2, cell 2</td>
    </tr>
</table>"""

>>> re.findall('<tr>(.*?)</tr>', doc, re.S)
['\n        <td>row 1, cell 1</td>\n        <td>row 1, cell 2</td>\n    ', 
 '\n        <td>row 2, cell 1</td>\n        <td>row 2, cell 2</td>\n    ']
>>> re.findall('<tr>(.*?)</tr>', doc, re.M)
[]