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
我有三个问题:
function\u name1
”,但非贪婪匹配似乎不起作用。为什么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
:
,因为(.*)
代表匹配任何字符“尽可能少”,然后正则表达式引擎选择匹配零字符。它将在\(?
如您所期望的那样)之前不匹配,因为?
仅表示“可选”
(?:\:\:|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
?另外,惰性匹配不会影响正则表达式开始匹配的位置-它只影响匹配的结束