使用正则表达式搜索时如何忽略不完整的数据集?
我想退回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
中呢?
答案 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}之外的字符}},越少越好。