我有一个大约80 000行的.asc文件,我想从文件中提取一些特定的行。
我试图通过在我想要提取信息/行(150个区域)的特定行(前一个和后一个)之间放置来使我更容易。
'start'正则表达式(MSG\s*(\d{1,8})\sSHOWING\sSENTENCE)
所以我想在发生这种情况后查找行
'结束'正则表达式(MSG\s*(\d{1,8})\sSENTENCE\sGONE)
所以当发生这种情况时,我将不再返回任何内容,直到'start'正则表达式再次出现。
这两个正则表达式之间会有数百行,但我只想要那些匹配这些正则表达式的行
(EFIX\sR\s*(\d{1,8})\s*(\d{1,8})\s*(\d{1,3})\s*(\d{1,3}).\d\s*(\d{1,3}).\d\s*(\d{1,4}) or (ESACC\sR\s*(\d{1,8})\s*(\d{1,8})\s*(\d{1,3})\s*(\d{1,3}).\d\s*(\d{1,3}).\d\s*(\d{1,4}).
我将如何在Python中解决这个问题?
答案 0 :(得分:0)
可以通过以下步骤轻松完成:
匹配
(EFIX\sR\s*(\d{1,8})\s*(\d{1,8})\s*(\d{1,3})\s*(\d{1,3})\.\d\s*(\d{1,3})\.\d\s*(\d{1,4}) or (ESACC\sR\s*(\d{1,8})\s*(\d{1,8})\s*(\d{1,3})\s*(\d{1,3})\.\d\s*(\d{1,3})\.\d\s*(\d{1,4})\.
所以示例代码可以是:
import re
P1 = 'MSG\s*\d{1,8}\sSHOWING\sSENTENCE([\s\S]+?)MSG\s*\d{1,8}\sSENTENCE\sGONE'
P2 = 'EFIX\sR\s*\d{1,8}\s*\d{1,8}\s*\d{1,3}\s*\d{1,3}\.\d\s*\d{1,3}\.\d\s*\d{1,4}|ESACC\sR\s*\d{1,8}\s*\d{1,8}\s*\d{1,3}\s*\d{1,3}\.\d\s*\d{1,3}\.\d\s*\d{1,4}\.'
sample = """
ESACC R 000000 7777 333.3 222 1111.
MSG 2355688 SHOWING SENTENCE
some text in between
EFIX R 5656 7878 123 456.8 122.9 5656
some text 1 here
some text 2 here
ESACC R 1075390 1075414 25 144.3 526.2 54.3 547.2 1.86 162
some text 3 here
some text 4 here
EFIX R 1212 505050 222 000.2 129.9 1010
some text 1 here
some text 2 here
ESACC R 1212 505050 222 000.2 129.9 1010.
some text 3 here
some text 4 here
MSG 2355688 SENTENCE GONE
EFIX R 5555555 8888888 9 666.6 999.8 0000
"""
in_between = re.findall(P1, sample)
for txt in in_between:
print re.findall(P2, txt)
输出:
['EFIX R 5656 7878 123 456.8 122.9 5656', 'ESACC R 1075390\t1075414\t25\t144.3\t526.2\t54.', 'EFIX R 1212 505050 222 000.2 129.9 1010', 'ESACC R 1212 505050 222 000.2 129.9 1010.']