【问题标题】:Parsing an XML-like file in Python在 Python 中解析类似 XML 的文件
【发布时间】:2017-07-26 12:12:29
【问题描述】:

我有这个文件,其中包含几个 math 标记,如下所示:

<Math 
   <Unique 262963>
   <BRect  1.02176" 0.09096" 1.86024" 0.40658">
   <MathFullForm `equal[therefore[char[tau]],plus[indexes[0,1,char[tau],char[c]],minus[times[indexes[
0,1,char[tau],char[s]],string[" and  "],over[times[char[d],char[omega]],times[char[
d],char[t]]]]]],over[char[tau],char[I]]]'
   > # end of MathFullForm
   <MathLineBreak  138.88883">
   <MathOrigin  1.95188" 0.32125">
   <MathAlignment Center>
   <MathSize MathMedium>
> # end of Math

就像这样:

<Math 
   <Unique 87795>
   <Separation 0>
   <ObColor `Black'>
   <RunaroundGap  0.0 pt>
   <BRect  0.01389" 0.01389" 0.17519" 0.22013">
   <MathFullForm `indexes[0,1,char[m,0,0,1,0,0],char[i]]'
> # end of MathFullForm

我想提取Unique标签和MathFullForm标签的内容,但是我不知道该怎么做。请注意,Unique 标记存在于文件中的其他位置,在 Math 标记之外。

我尝试过使用正则表达式,但效果不太好,并且遗漏了许多标签。然后我考虑使用 XML 解析器,但是因为代码不是有效的 XML,所以这行不通。

谁能引导我在 Python 中朝着正确的方向前进(可以接受正则表达式解决方案)。

【问题讨论】:

  • 您的类似 XML 的格式是可理解的标准吗?我以前没有遇到过。
  • @chocksaway 适用于 Adob​​e Framemaker:help.adobe.com/en_US/framemaker/mifreference/mifref.pdf
  • 优秀 - 所以是标准格式。

标签: python regex xml parsing


【解决方案1】:

您可以使用循环来删除标签。 re.finditer() 可用于迭代提取标签。

检查下面的代码,看看它是否适合你。

text = re.sub(r'\r|\n',' ',text)
for m in re.finditer(r'(\<Unique\s).*?\>',text):
   print m.group()
for m in re.finditer(r'(\<MathFullForm\s).*?\>',text):
   print m.group()

【讨论】:

    【解决方案2】:

    您可以使用这个正则表达式,指定DOTALL 标志(否则. 也不会匹配\n):

    <(Unique|MathFullForm)(.*?)>
    

    第一个捕获组表示匹配是否属于UniqueMathFullForm 标签,而在第二个捕获组中您可以找到标签的内容。

    【讨论】:

    • 对不起,我应该提到Unique标签也存在于Math标签之外
    • 为什么这个正则表达式会有问题?
    • 我想要与 MathFullForm 对应的唯一编号
    【解决方案3】:

    我通过使用以下正则表达式找到了解决方案:

    <Math\s*<Unique[^>]*>\s*(?:<Separation[^>]*>)*\s*(?:<ObColor[^>]*>)*\s*(?:<RunaroundGap[^>]*>)*\s*<BRect[^>]*>\s*<MathFullForm `[^']*'
    

    这匹配整个标签,所以我可以使用另外两个正则表达式来提取必要的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2015-02-14
      相关资源
      最近更新 更多