[英]Python regular expression not matching end of line
我正在嘗試使用相當復雜的正則表達式來匹配C / C ++函數定義。 我發現了一個不起作用的案例,我試圖理解為什么。 這是輸入字符串不匹配:
void Dump(const char * itemName, ofstream & os)
這顯然是一個有效的C ++方法聲明。 這是RE:
^[^=+-|#]*?([\w<>]+\s+(?!if|for|switch|while|catch|return)\w+)\s*\([^;=+-|]*$
這基本上試圖區分其他看起來像方法聲明的C語法,即具有單詞后跟paransheses的語法。
使用非常有用的Python正則表達式調試器(http://www.pythonregex.com/)我將其縮小到尾隨“$” - 如果我刪除正則表達式中的尾隨$,它匹配上面的方法簽名; 如果我留在$,它不會。 必須有一些Python RE的特性,這是我在這里躲避的。 謝謝。
使用+-|
在你的角色類中[^;=+-|]
是一個范圍規范。 這將導致包含(實際排除,因為您正在使用^
)的字符類遠遠超出您的意圖。 要指定文字-
在字符類中,首先提及它,如[^-;=+|]
。
PythonRegex的輸出有點誤導。 r.groups()
和r.findall()
結果都是相同的: u'void Dump'
,這是第一個捕獲組的內容。 如果它顯示了整個匹配,你會看到當刪除$
你只是匹配
void Dump(
...不是你想要的整個功能定義。 原因(正如Greg解釋的那樣)是你上一個字符類中的語法錯誤。 您需要首先列出連字符( [^-;=+|]
)或最后( [^;=+|-]
),或者添加反斜杠( [^;=+\\-|]
)來轉義連字符。
我能看到讓PythonRegex顯示整個匹配的唯一方法是刪除所有捕獲組(或將它們轉換為非捕獲組)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.