Python正则表达式-非贪婪匹配不起作用 我有一个平面文件,其中一个C++函数名和它的声明的一部分如下: virtual void NameSpace1::NameSpace2::ClassName1::function_name1(int arg1) const void function_name2 void NameSpace2::NameSpace4::ClassName2::function_name3 function_name4

Python正则表达式-非贪婪匹配不起作用 我有一个平面文件,其中一个C++函数名和它的声明的一部分如下: virtual void NameSpace1::NameSpace2::ClassName1::function_name1(int arg1) const void function_name2 void NameSpace2::NameSpace4::ClassName2::function_name3 function_name4,python,regex,python-2.7,non-greedy,Python,Regex,Python 2.7,Non Greedy,我试图使用以下行单独提取函数名: fn_name = re.match(":(.*?)\(?", lines) fn_name = re.match(":(.*?)\(?", lines) 我能理解为什么函数名2和函数名4不匹配(因为没有前导:。但我发现即使对于函数名1和函数名3,它也不会进行非贪婪匹配。fn\u name.group()的输出是 :NameSpace2::ClassName1::function_name1 我有三个问题: 我只希望从第1行提取字符串“function\u

我试图使用以下行单独提取函数名:

fn_name = re.match(":(.*?)\(?", lines)
fn_name = re.match(":(.*?)\(?", lines)
我能理解为什么
函数名2
函数名4
不匹配(因为没有前导
。但我发现即使对于
函数名1
函数名3
,它也不会进行非贪婪匹配。
fn\u name.group()
的输出是

:NameSpace2::ClassName1::function_name1
我有三个问题:

  • 我只希望从第1行提取字符串“
    function\u name1
    ”,但非贪婪匹配似乎不起作用。为什么
  • 为什么没有提取第3行
  • 如何使用单个正则表达式从所有行中获取函数名
  • 请帮助。

    1)始终为正则表达式使用
    r”“
    字符串

    (二)

    我试图使用以下行单独提取函数名:

    fn_name = re.match(":(.*?)\(?", lines)
    
    fn_name = re.match(":(.*?)\(?", lines)
    
    fn_name.group()的输出为

    我没有看到:

    import re
    
    line = "virtual void NameSpace1::NameSpace2::ClassName1::function_name1(int arg1) const"
    
    fn_name = re.search(r":(.*?)\(?", line)
    print(fn_name.group())
    
    --output:--
    :
    
    在任何情况下,如果您想了解非贪婪的工作原理,请查看以下代码:

    import re
    
    line = "N----1----2"
    
    greedy_pattern = r"""
        N
        .*
        \d
    """
    
    match_obj = re.search(greedy_pattern, line, flags=re.X)
    print(match_obj.group())
    
    non_greedy_pattern = r"""
        N
        .*?
        \d
    """
    match_obj = re.search(non_greedy_pattern, line, flags=re.X)
    print(match_obj.group())
    
    --output:--
    N----1----2
    N----1
    
    非贪婪版本要求所有匹配的字符都匹配到遇到的第一个数字,而贪婪版本将尝试查找紧跟着一个数字的
    *
    的最长匹配

    3) 警告!没有正则区域

    func_names = [
    "virtual void NameSpace1::NameSpace2::ClassName1::function_name1(int arg1) const",
    "void function_name2",
    "void NameSpace2::NameSpace4::ClassName2::function_name3",
    "function_name4",
    ]
    
    for func_name in func_names:
        name = func_name.rsplit("::", 1)[-1]
    
        pieces = name.rsplit(" ", 1)
    
        if pieces[-1] == "const":
            name = pieces[-2]
        else:
            name = pieces[-1]
    
        name = name.split('(', 1)[0]
        print(name)
    
    --output:--
    function_name1
    function_name2
    function_name3
    function_name4
    

    这非常有效,至少在您的示例中:

    ^(?:\w+ +)*(?:\w+::)*(\w+)
    
    i、 例如,在Python代码中:

    import re
    
    function_name = re.compile(r'^(?:\w+ +)*(?:\w+::)*(\w+)', re.MULTILINE)
    matches = function_name.findall(your_txt)
    
    # -> ['function_name1', 'function_name2', 'function_name3', 'function_name4']
    
    外卖:如果你可以用贪婪匹配来做,那么就用贪婪匹配来做


    请注意,对于C标识符,
    \w
    不正确的,但写下与之匹配的技术上正确的字符类并不是问题所在。查找并使用正确的字符集,而不是
    \w

  • 我只希望从第1行提取字符串“function_name1”,但非贪婪匹配似乎不起作用。为什么?
  • 这是正则表达式的结果

    我认为你的正则表达式太懒了。它将只匹配
    ,因为
    (.*)
    代表匹配任何字符“尽可能少”,然后正则表达式引擎选择匹配零字符。它将在
    \(?
    如您所期望的那样)之前不匹配,因为
    仅表示“可选”

  • 为什么没有提取第3行
  • 我已经测试了你的正则表达式,它根本不起作用,不仅仅是第三行

  • 如何使用单个正则表达式从所有行中获取函数名
  • 您可以从这个最小的示例开始

    (?:\:\:|void\s+)(\w+)(?:\(|$)|(function_name4)
    
    其中,
    (?:\:\:\void\s+)
    表示函数名前面的任何内容,
    (?:\($)
    表示函数名后面的任何内容

    请注意,
    函数\u name4
    由于缺少模式,因此假定显式声明


    请参阅:

    在尝试从“N foo bar N---1---2”中捕获“N---1”时,我曾被类似的问题难倒。添加一个前导。*得到了期望的结果

    import re
    line = "N foo bar N----1----2"
    match_obj = re.search(r'(N.*?\d)', line)
    print(match_obj.group(1)) 
    
    match_obj = re.search(r'.*(N.*?\d)', line)
    print(match_obj.group(1))
    
    --output:--
    N foo bar N----1
    N----1
    

    您是否知道
    re.match
    从字符串的开头开始匹配?您的所有字符串都不是以冒号开头的。您是否尝试过
    re.search
    ?另外,惰性匹配不会影响正则表达式开始匹配的位置-它只影响匹配的结束