1)總是使用r" "
字符串作爲正則表達式。
2)
我想通過這條線單獨提取函數名:
fn_name = re.match(":(.*?)\(?", lines)
fn_name.group()的輸出是
:NameSpace2::ClassName1::function_name1
我沒有看到:
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
你是否知道're.match'匹配從字符串的開頭開始?您的任何字符串都不以冒號開頭。你嘗試過're.search'嗎? –
延遲匹配不影響正則表達式開始匹配的位置 - 它隻影響匹配的結束 –