我有下面的文本块,我希望找到所有出现的内容;
data ...;
...
run;
其中...可以是任何类型的字符串模式。我想只找到这样的情况,其中模式不在C样式注释中,或者它是否包含在下面的另一个模式中。我想找到所有出现的;
data foo;
set bar;
run;
但不是
%macro x();
data foo;
set bar;
run;
%mend;
或
/* data foo;*/
/* set bar;*/
/* run;*/
我有以下函数,它将在评论或%macro ... %mend
中包含时排除模式,但它只返回最后一个匹配而不是每次出现。如何调整此值以将每个匹配作为列表列表返回,每个块有一个列表?提前谢谢。
s = """
/**
* @file
* @brief Description of the program
*/
/**
* @macro xyz
* @brief Description of the Macro
*/
%macro xyz();
data foo_nomatch;
set bar;
run;
%mend;
/**
* @data foo_matchme
* @brief Description of the DataStep
*/
data foo_matchme;
set bar;
run;
# Should Not Match
/**
* data foo_nomatch2;
* set bar;
* run;
*/
/**
* @datastep: foo2
* @brief: This is a description.
*/
# Should match as a 2nd match
data foo_matchme2;
set bar;
run;
"""
def datastep(s):
t1 = 'data'
t2 = 'run;'
t3 = ';'
e1 = re.escape('/**')
e2 = re.escape('*/')
e3 = re.escape('%macro')
e4 = re.escape('%mend')
return re.findall('%s.*%s|%s.*%s|(%s.*?%s)' %(e1,e2,e3,e4,t1,t2),s,re.DOTALL|re.IGNORECASE)
print(datastep(s))
答案 0 :(得分:1)
将.*
- skip-subregexx的一部分设为非贪婪,即将'%s.*%s|%s.*%s|(%s.*?%s)'
更改为'%s.*?%s|%s.*?%s|(%s.*?%s)'
。
演示:
for match in datastep(s):
if match:
print(match)
输出:
data foo_matchme;
set bar;
run;
data foo_matchme2;
set bar;
run;