gpt4 book ai didi

Python Regex - 非贪婪匹配不起作用

转载 作者:行者123 更新时间:2023-11-28 20:40:17 25 4
gpt4 key购买 nike

我有一个平面文件,其中包含一个 C++ 函数名称及其声明的一部分,如下所示:

virtual void NameSpace1::NameSpace2::ClassName1::function_name1(int arg1) const
void function_name2
void NameSpace2::NameSpace4::ClassName2::function_name3
function_name4

我正在尝试使用这一行单独提取函数名称:

fn_name = re.match(":(.*?)\(?", lines)

我能理解为什么 function_name2function_name4 不匹配(因为没有前导 :。但我看到即使对于 function_name1function_name3,不做非贪婪匹配,fn_name.group()的输出是

:NameSpace2::ClassName1::function_name1

我有三个问题:

  1. 我希望从第 1 行中提取字符串“function_name1”,但非贪婪匹配似乎不起作用。为什么?
  2. 为什么没有提取第 3 行?
  3. 如何使用单个正则表达式从所有行中获取函数名称?

请帮忙。

最佳答案

这很有效,至少对于你的例子:

^(?:\w+ +)*(?:\w+::)*(\w+)

即,在 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']

要点:如果可以用贪心匹配来做,就用贪心匹配来做。


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

关于Python Regex - 非贪婪匹配不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36102424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com