正则表达式“(?s-i)^ ST.I_FAIL:。+?\ RST.VND_PORT:。+?”的python等价物是什么?

我有文本文件“ Test_input.txt”,其中包含如下所示的数据:

SAS I:
    ST.I_FAIL:
    (I) @LINE: 9
    >>>     
    >>> Value
ST.VND_PORT:
TEXT:<<SOIS>>.STV:SV


SAS II:
    ST.I_FAIL:
    (I) @LINE: 20
    >>>     20
    >>> compare
ST.VND_PORT:
TEXT:<<SOIS>>.STV:SV

SAS III:
    ST.I_FAIL:
    (I) @LINE: 50
    >>>     20
    >>> 50
    >>>50
    >>>50
ST.VND_PORT:
TEXT:<<SOIS>>.STV:SV

输出文件应按如下所示进行修改(“ Test_output.txt”):

SAS I:
TEXT:<<SOIS>>.STV:SV

SAS II:
TEXT:<<SOIS>>.STV:SV

SAS III:
TEXT:<<SOIS>>.STV:SV

有900个案例(从SAS I到SAS 900)。

它们每个都有错误,如以上文本所示。要从“ Test_input.txt”中手动删除所有错误,将花费大量时间。 因此,我使用了正则表达式,如下所示,它在notepad ++工具中运行良好:

```(?s-i)^ST.I_FAIL:.+?\RST.VND_PORT:.+?```

从“ Test_input.txt”中删除执行类似操作的错误行的python等价代码是什么?

评论
  • 老实人
    老实人 回复

    如果您真正想捕获的只是包含“ SAS ...”和“ TEXT:...”的行,并且总共只有〜900行。我会尝试如下所示的正则表达式来匹配它们:

    import re
    your_string = """
    SAS I:
        ST.I_FAIL:
        (I) @LINE: 9
        >>>     
        >>> Value
    ST.VND_PORT:
    TEXT:<<SOIS>>.STV:SV
    
    
    SAS II:
        ST.I_FAIL:
        (I) @LINE: 20
        >>>     20
        >>> compare
    ST.VND_PORT:
    TEXT:<<SOIS>>.STV:SV
    
    SAS III:
        ST.I_FAIL:
        (I) @LINE: 50
        >>>     20
        >>> 50
        >>>50
        >>>50
    ST.VND_PORT:
    TEXT:<<SOIS>>.STV:SV
    """
    with open('Test_output.txt', 'w') as outfile:
        for pair in re.findall(r'(SAS.*?:).*?(TEXT.*?)\n',s,re.M|re.S):
            outfile.write(''.join([pair[0],'\n',pair[1],'\n']))
    

    希望这会有所帮助。