正则表达式包括换行符

时间:2015-10-16 14:11:38

标签: python regex xml

我有以下xml文件

<p style="1">
A
</p>
<div xml:lang="unknown">
<p style="3">
B
C
</div>
<div xml:lang="English">
<p style="5">
D
</p>
<p style="1">
Picture number 3?
</p>

我只想在<div xml:lang="unknown"></div>之间获取文字。 所以我尝试了这段代码:

import os, re

html = open("2.xml", "r")
text = html.read()
lon = re.compile(r'<div xml:lang="unknown">\n(.+)\n</div>', re.MULTILINE)
lon = lon.search(text).group(1)
print lon

但它似乎无法发挥作用。

3 个答案:

答案 0 :(得分:2)

1)不要用正则表达式解析XML。它只是不起作用。使用XML parser

2)如果您确实使用正则表达式,则不希望re.MULTILINE控制^$在多行字符串中的工作方式。您需要re.DOTALL,它控制.是否与\n匹配。

3)您可能还希望您的模式使用non-greedy +? operator返回尽可能短的匹配。

lon = re.compile(r'<div xml:lang="unknown">\n(.+?)\n</div>', re.DOTALL)

答案 1 :(得分:0)

你可以像这样解析一段块代码,当你在一个块中并设置一个标志True时,当你出去并设置标志False并突破时。

def get_infobox(self):
    """returns Infobox wikitext from text blob
    learning form https://github.com/siznax/wptools/blob/master/wp_infobox.py
    """
    if self._rawtext:
        text = self._rawtext
    else:
        text = self.get_rawtext()
    output = []
    region = False
    braces = 0
    lines = text.split("\n")
    if len(lines) < 3:
        raise RuntimeError("too few lines!")

    for line in lines:
        match = re.search(r'(?im){{[^{]*box$', line)
        braces += len(re.findall(r'{{', line))
        braces -= len(re.findall(r'}}', line))
        if match:
            region = True
        if region:
            output.append(line.lstrip())
            if braces <= 0:
                region = False
                break
    self._infobox = "\n".join(output)
    assert self._infobox
    return self._infobox

答案 2 :(得分:0)

您可以尝试拆分div并只匹配列表项。这也适用于正则表达式的大数据。

import re

html = """<p style="1">
A
</p>
<div xml:lang="unknown">
<p style="3">
B
C
</div>
<div xml:lang="English">
<p style="5">
D
</p>
<p style="1">
Picture number 3?
</p>
"""

for div in html.split('<div'):
 m = re.search(r'xml:lang="unknown">.+(<p[^<]+)', div, re.DOTALL)
 if m:
   print m.group(1)