在Python

时间:2017-07-26 12:12:29

标签: python regex xml parsing

我的文件包含多个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中执行此操作(可以使用正则表达式解决方案)。

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

您可以使用此正则表达式,指定<form #myForm="ngForm" ngNativeValidate (ngSubmit)="addVisitor()"> <div class="ui-input-group"> <input #model="ngModel" type="text" class="form-control" required placeholder="Name*" name="visitorName" [(ngModel)]="visitorName"> </div> <button type="submit">Submit</button> </form> 标记(否则DOTALL也不会与.匹配):

\n

第一个捕获组说明匹配是属于<(Unique|MathFullForm)(.*?)> 还是Unique标记,而在第二个捕获组中,您可以找到标记的内容。

答案 2 :(得分:0)

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

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

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