用于解析嵌入XML的表格的正则表达式

0 投票
4 回答
811 浏览
提问于 2025-04-16 05:29

假设我们有一个表格:

Key|Val|Flag
01 |AAA| Y
02 |BBB| N
...

然后把它用XML的方式包装成这样:

<Data>
  <R><F>Key</F><F>Val</F><F>Flag</F></R>
  <R><F>01</F><F>AAA</F><F>Y</F></R>
  <R><F>02</F><F>BBB</F><F>N</F></R>
  ...
</Data>

显然,表格里可以有更多的列和行。

现在我想用一个正则表达式把XML解析回表格。

我可以找到所有的字段,使用的正则是 '<F>([\w\d]*)</F>',但是我需要把它们按行分组。

我想到了 <R>(<F>([\w\d]*)</F>)*</R>,但是在Python中实现时什么都找不到。

有没有人能帮我写个正则表达式?

更新

这是问题的一些背景信息。

我知道有很多XML解析库,但不幸的是,我的环境只能使用标准库。不过还是感谢那些提醒我不要用正则解析XML的人。

我需要一个快速且简单的解决方案,所以我决定先用正则,然后再考虑解析。

到目前为止,我有了以下代码:

...
row_p = r'<R>(.*?)</R>'
field_p = r'<F>(.*?)</F>'
table = ''

for row in re.finditer(row_p, xml):
    table += '|'.join(re.findall(field_p, row.group(1))) + '\n'

...

这段代码在处理小数据集(大约10,000行)时有效,但在处理超过500,000行的表格时就失败了。

也许我会调查一下为什么会失败,但我接下来的计划是切换到某个标准的XML解析器。ElementTree 是我考虑的第一个选项。

4 个回答

0

如果这个问题是关于Perl的,我可以给你提供一个解决方案和代码,但因为这是关于Python的。

无论如何,我建议你先加载这个xml文件,然后一行一行地读取它。循环每一行,直到文件结束,找出这一行中的所有字段。根据我的了解,Python中的匹配结果会存储在一个数组里。就这样。希望我能用代码给你演示,但这只是一个大概念:

load file
foreach line in <file>
    if regex.match('<F>([\w\d]*)</F>', line)
        print matches[1] . '|' . matches[2] . '|' . matches[3] . "\n"
end loop

免责声明: 上面的代码只是一个初步的想法

哦,对了,如果可以的话,建议使用XML解析器来处理。

2

必看链接:

使用XML解析器。lxml 非常好,它提供了很多与XML相关的功能,其中包括XPath。如果你喜欢用一行代码搞定事情,我敢肯定有个XPath的一行代码可以提取这些元素;)

0
import libxml2

txt = '\n<Data>\n  <R><F>Key</F><F>Val</F><F>Flag</F></R>\n  <R><F>01</F><F>AAA</F><F>Y</F></R>\n  <R><F>02</F><F>BBB</F><F>N</F></R>\n</Data>\n'

rows = []
for elem in libxml2.parseDoc(txt):
    if elem.name == 'R':
        curRow = []
        rows.append(curRow)
    elif elem.name == 'F':
        curRow.append(elem.get_content())
rows = [['Key', 'Val', 'Flag'], ['01', 'AAA', 'Y'], ['02', 'BBB', 'N']] 

返回:

撰写回答