首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找所有出现的字符串,除非在另一个模式中找到。

查找所有出现的字符串,除非在另一个模式中找到。
EN

Stack Overflow用户
提问于 2017-05-06 09:22:37
回答 1查看 74关注 0票数 1

我有像下面这样的文本块,我在那里寻找所有的出现;

代码语言:javascript
复制
data ...;
...
run;

在哪里..。可以是任何类型的字符串模式。我只想找到这种情况的出现,如果模式不在C样式注释中,或者它被包装在另一个模式中,如下面所示。我要找出所有的事情;

代码语言:javascript
复制
data foo;
    set bar;
run;

但不是

代码语言:javascript
复制
%macro x();
    data foo;
        set bar;
    run;
%mend;

代码语言:javascript
复制
/* data foo;*/
/* set bar;*/
/* run;*/

我有以下函数,它将在封装在注释或%macro ... %mend中时排除模式,但是它只是返回最后一次匹配,而不是每次发生。我如何调整这一点,以返回每一个匹配作为一个列表的列表,每块一个列表?提前谢谢。

代码语言:javascript
复制
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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-06 10:02:17

使跳过子规则的.*-part不贪婪,即将'%s.*%s|%s.*%s|(%s.*?%s)'更改为'%s.*?%s|%s.*?%s|(%s.*?%s)'

演示:

代码语言:javascript
复制
for match in datastep(s):
    if match:
        print(match)

输出:

代码语言:javascript
复制
data foo_matchme;
    set bar;
run;
data foo_matchme2;
    set bar;
run;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43818798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档