我有以下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
但它似乎无法发挥作用。
答案 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)