【问题标题】:How can I find a method name not within a comment?如何找到不在评论中的方法名称?
【发布时间】:2011-09-20 04:37:09
【问题描述】:

我问了this question earlier,但我没有正确表达自己。如果我有这三种情况:

void aMethod(params ...)
//void aMethod(params
// void aMethod(params
  ^ can have any number of spaces here

我如何调整我的正则表达式以仅在评论中找不到字符串时才匹配?这是我的正则表达式:

re.search("(?<!\/\/)\s*void aMethod",buffer)

这会抓住一切吗:

(?<!\/\/)(?<!\s)+void onMouseReleased

【问题讨论】:

  • 只有这三种情况吗?怎么样:/*foo void aMethod(params) bar*/(多行注释)和"foo void aMethod(params) bar"(字符串文字)
  • Python 没有分词器吗?
  • @Bart,多行不会出现。
  • @Geo,以及可能包含看起来像方法调用的文本的字符串文字?
  • 请告诉我们更多关于您的问题的信息。很有可能,用正则表达式解决会很疯狂。顺便说一句,pypi.python.org/pypi/pygccxmlcode.google.com/p/pycparser.

标签: python regex


【解决方案1】:

这应该为您的示例做一些事情:

re.search("^(?!\/\/)\s*void aMethod",line)

【讨论】:

  • 我只是好奇,是否有可能采用消极的后视解决方案?
  • @Geo,不,因为后面的外观必须具有固定的宽度。所以你不能把\s*\s+ 放在一个look-behind 里面。
  • 是的,我知道固定宽度。但是不能用 + 重复后视,就像对空间的后视一样吗?
  • 您也许应该在其他地方也允许多余的空白。搜索行首然后立即否定前瞻与使用匹配相同,只是不包括 // 在正则表达式中:re.match("\s*void\s+aMethod\s*\(\s*params")
【解决方案2】:

如果您想忽略 cmets,我建议您首先“预处理”您的文件以忽略/删除 cmets。见:Python snippet to remove C and C++ comments

【讨论】:

    【解决方案3】:

    有什么特别需要使用正则表达式吗?如果没有,您也可以尝试使用以下内容:

    a = """void aMethod(params ...)
    //void aMethod(params
    // void aMethod(params
      ^ can have any number of spaces here"""
    
    for line in a.split('\n'):
        if not line.strip().startswith("//") and "void aMethod(params" in line:
            print line
    

    根据懒惰的评论编辑

    【讨论】:

    • 这将排除应包含的void aMethod(params //,并包含应排除的var = "asdf aMethod asdf"。请改用if not line.strip().startswith("//") and "void aMethod(params" in line。请记住,这仅在此处和此处没有多余的空格时才有效,例如:void aMethod( params.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2010-12-03
    • 2020-12-19
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多