我是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)
我的错是什么;
答案 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 demo和this 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)