'two'两个正则表达式之间的正则表达式

时间:2016-04-12 14:19:20

标签: regex

我有一个大约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中解决这个问题?

1 个答案:

答案 0 :(得分:0)

可以通过以下步骤轻松完成:

  1. 在“开始”正则表达式和“结束”正则表达式模式之间捕获内容;
  2. 匹配

    (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})\.

  3. 所以示例代码可以是:

    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.']