使用python从航空文本中提取段落

时间:2017-10-24 09:24:08

标签: python regex

我是python中的新手,我尝试使用python从段落中提取文本。 文字是:

<stx>(FPL-ACF66-IN
-EH30/H-S/C
-LGKR0900
-N0100VFR KRK ARA
-LGTG0300
-DOF/120928)
<etx>
<stx>GG
(APL-ACF66-IN
-EH30/H-S/C
-LGKR0900
-N0100VFR KRK ARA
-LGTG0300
-DOF/110928)
<etx>
<stx>
(CNL-ACF66-IN
-EH30/H-S/C
-LGKR0900
-N0100VFR KRK ARA
-LGTG0300
-DOF/120928)<etx>

我希望从FPL中提取到-DOF / 120928)整个pagagraph

(FPL-ACF66-IN
-EH30/H-S/C
-LGKR0900
-N0100VFR KRK ARA
-LGTG0300
-DOF/120928)

我使用该代码,但它只提取第一行:FPL-ACF66-IN

import re

with open('FPL.txt', 'r', encoding = 'utf-8') as f:
        works = f.read()

        pattern = 'FPL'+'.*'
        w =re.findall(pattern, works, re.I)
        for work in w:
            print(work)

我的错是什么;

1 个答案:

答案 0 :(得分:0)

虽然您肯定可以使用像(see a demo here这样的正则表达式,但请注意修饰符)

\(FPL.+?-DOF/120928\)

这看起来像某种xml文件,所以为什么不使用解析器呢?

<小时/> Python中的代码段:

import re

rx = re.compile(r'\(FPL.+?-DOF/120928\)', re.DOTALL)

with open("test.txt") as fp:
    data = fp.read()
    try:
        paragraph = rx.search(data).group(0)
    except:
        paragraph = None
    print(paragraph)

这会产生

(FPL-ACF66-IN
-EH30/H-S/C
-LGKR0900
-N0100VFR KRK ARA
-LGTG0300
-DOF/120928)

<小时/> 如果您想在此处使用所有段落,可以使用

\([^()]+\)

甚至

<stx>(.+?)<etx>

然后循环播放它们,请参阅the modified demothis one for stx and etx 对于后者:

import re

rx = re.compile(r'<stx>(.+?)<etx>', re.DOTALL)

with open("test.txt") as fp:
    data = fp.read()
    paragraphs = (m.group(1) for m in rx.finditer(data))

    for p in paragraphs:
        print(p)