使用正则表达式忽略不完整的数据集?

时间:2019-08-09 13:40:42

标签: python regex python-3.x

使用正则表达式搜索时如何忽略不完整的数据集?

我想退回IN_MEASUREMENT的{​​{1}}个项目。

FUNCTION

它正在返回import re sFileContent = ''' /begin FUNCTION foo "a.1.2.3 footext" /begin SUB_FUNK fooo foobar foobar /end SUB_FUNK FUNK_VERSION "a.1.2.3" /end FUNCTION /begin FUNCTION foobarbarbar "SSV-TAG 3.1.0-3.1.0 foobarbarbar tex text_tex" /begin SUB_FUNK foobarbarbarfoo foobarbarbarfooo foobarbarbarfoooo /end SUB_FUNK /begin IN_MEASUREMENT barbar barfoo /end IN_MEASUREMENT /begin OUT_MEASUREMENT barfoobar barbarfoo /end OUT_MEASUREMENT /begin LOC_MEASUREMENT loc_barfoobar barbarfoo_loc /end LOC_MEASUREMENT FUNK_VERSION "3.1" /end FUNCTION''' sSearch = r'/begin FUNCTION\s*(\S*)\s*(?:"[^"]*").*? /begin IN_MEASUREMENT\s*(.*?)\s*/end IN_MEASUREMENT.*?/end FUNCTION' lMatches = re.findall(sSearch, sFileContent, re.S) print(lMatches)

但是,它应该返回[('foo', 'barbar barfoo')],因为第一个[('foobarbarbar', 'barbar barfoo')]不包含任何FUNCTION。 我可以不使用两个串联的正则表达式搜索来解决此问题吗(每个IN_MEASUREMENT一次,然后在此搜索FUNCTION中呢?

1 个答案:

答案 0 :(得分:1)

您可以使用脾气暴躁的令牌:

/begin FUNCTION\s*(\S*)\s*(?:"[^"]*")(?:(?!/begin FUNCTION).)*? /begin IN_MEASUREMENT\s*(.*?)\s*/end IN_MEASUREMENT.*?/end FUNCTION
#                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^

请参见regex demo

(?:(?!/begin FUNCTION).)*?模式将匹配0个或更多不以/begin FUNCTION子字符串开头的字符。

为使其运行更快,我建议将TGT构造展开为[^/]*(?:/(?!begin FUNCTION)[^/]*)*

/begin FUNCTION\s*(\S*)\s*(?:"[^"]*")[^/]*(?:/(?!begin FUNCTION)[^/]*?)* /begin IN_MEASUREMENT\s*(.*?)\s*/end IN_MEASUREMENT.*?/end FUNCTION
#                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

请参见this regex demo

[^/]*(?:/(?!begin FUNCTION)[^/]*?)*匹配除/之外的0+个字符,然后匹配0个或更多/且不跟begin FUNCTION的字符,然后匹配0+个除{{1}之外的字符}},越少越好。