如何使用Perl删除<math> </math>多行部分?

时间:2015-10-09 19:49:29

标签: perl

如何使用Perl删除多行部分?

我有这样的维基测试代码:

{|
|-
| colspan="2"|
: <math>
[\underbrace{\color{Red}4,2}_{4 > 2},5,1,7] \rightarrow
[2,\underbrace{\color{OliveGreen}4,5}_{4 < 5},1,7] \rightarrow
[2,4,\underbrace{\color{Red}5,1}_{5 > 1},7] \rightarrow
[2,4,1,\underbrace{\color{OliveGreen}5,7}_{5 < 7}]
</math>
|-
|
: <math>
[\underbrace{\color{OliveGreen}2,4}_{2 < 4},1,5,{\color{Blue}7}] \rightarrow
[2,\underbrace{\color{Red}4,1}_{4 > 1},5,{\color{Blue}7}] \rightarrow
[2,1,\underbrace{\color{OliveGreen}4,5}_{4 < 5},{\color{Blue}7}]
</math>
: <math>
[\underbrace{\color{Red}2,1}_{2 > 1},4,{\color{Blue}5},{\color{Blue}7}] \rightarrow
[1,\underbrace{\color{OliveGreen}2,4}_{2 < 4},{\color{Blue}5},{\color{Blue}7}]
</math>
: <math>
[\underbrace{\color{OliveGreen}1,2}_{1 < 2},{\color{Blue}4},{\color{Blue}5},{\color{Blue}7}]
</math>
|}

我想从这段代码中删除所有如何操作?我已经完成了这样的代码:

cat math-text.txt | perl -e 'while(<>) { s/<math>.+?<\/math>//gs; print $_; }'

它不起作用,但是因为文档解释了.会有很多新的内容。怎么做?

1 个答案:

答案 0 :(得分:1)

以下是一个python脚本,我用它从wikipedia转储中提取所有数学公式。它不是使用多行正则表达式,而是扫描<math> </math>的出现次数,并使用该行上的位置来计算线上实际位置的位置,并使用有限状态机来查找实际方程,基本上由inEqn确定的两个状态。它还做了一些其他的事情,比如在数学标签中找到标题和名称空间以及属性。

由于转储大约为100MB,使用逐行方法最终可能比多行正则表达式更有效。

import sys
import re

titleRE = re.compile('<title>(.*)</title>')
nsRE = re.compile('<ns>(.*)</ns>')
mathRE = re.compile('&lt;/?math(.*?)&gt;')
pageEndRE = re.compile('</page>')

title =""
attr = ""
ns = -1
inEqn = 0
for line in sys.stdin:
    m = titleRE.search(line)
    if m :
        title = m.group(1)
        expression = ""
        inEqn = 0
    m = nsRE.search(line)
    if m :
        ns = m.group(1)
    start = 0
    pos = 0
    m = mathRE.search(line,pos)
    while m :
        if m.group().startswith('&lt;math'):
            attr = m.group(1)
            start = m.end()
            pos = start
            expression = ""
            inEqn = 1
        if m.group() == '&lt;/math&gt;' :
            end = m.start()
            expression = '    '.join([expression,line[start:end]])
            print title,'\t',attr,'\t',expression.lstrip().replace('&lt;','<').replace('&gt;','>').replace('&amp;','&')
            pos = m.end()
            expression = ""
            start = 0
            inEqn = 0
        m = mathRE.search(line,pos)
    if start > 0 :
        expression = line[start:].rstrip()
    elif inEqn :
        expression = '    '.join([expression,line.rstrip()])

另一种选择可能是考虑使用xml解析器。基于SAX或DOM的解析器将能够找到方程。如果您想对维基文本进行更复杂的分析,这可能值得考虑。