簡體   English   中英

如何修復非貪婪的正則表達式

[英]How to fix non-greedy regular expression

word = "\W*?[^,\t ]*?\W*?"
quotedSelectedWord = "\W*?\"(.*?)\"\W*?"
leftCurlyBrace = "\W*?\{\W*?"
rightCurlyBrace = "\W*?\}\W*?"
expression = leftCurlyBrace + word + "," + quotedSelectedWord

p = re.compile(expression)

for line in sourceFileList:
    line = line.strip()
    if (p.match(line)):         
        temp1 = p.sub(r"\1", line);
        print "temp1 = " + temp1 + "\n"

如果第一行是(沒有實際的單引號):'{_ blah_blah,'blah-blah“,”blah blah blah“,false,false,{_blah},”“},'

為什么temp1 ='blah-blah,'blah blah blah“,false,false},'?

我認為這相當於括號中的第一個“組”,我認為這將是“等等”。

正則表達式查找模式不是一次而是兩次。

它找到的第一個是:

{_blah_blah, "blah-blah"

在這種情況下, group(1)你把括號以上的部分)是blah-blah ,因為你確定的,它用來替換的字符串的第一部分。

但它也在這里找到了模式:

, {_blah}, ""

這里group(1) ,仍在尋找.*? ,是一個空字符串。 所以它沒有任何東西替換字符串的那部分,有效地刪除它。

這個網站幫我解決了這個問題。

這是一個顯示以下匹配項的網站

與正則表達式的鏈接到位。

在此輸入圖像描述

更新

這個網站在解析正則表達式時更有幫助: http//regex101.com/#python

在此站點上,輸入正則表達式。 重要的一點是在其右側輸入g修飾符以獲得所有匹配。 接下來輸入測試字符串和\\1替換。 它已經顯示了匹配和替換。 這很好。 現在在左側單擊“正則表達式調試器”。

在此輸入圖像描述

如果您展開此部分,您將能夠確切地看到它如何找到2個匹配項:

在此輸入圖像描述

python文檔聲明了re.sub(pattern, repl, string, count=0, flags=0)

返回通過替換repl替換字符串中最左邊的非重疊模式而獲得的字符串。

如果我們重寫一下for循環:

for line in sourceFileList:
    line = line.strip()
    match = p.match(line)
    if (match):
        print "whole match = " + match.group()
        print "first group = " + match.group(1)
        temp1 = p.sub(r"\1", line)
        print "temp1 = " + temp1 + "\n"

我們得到輸出:

whole match = {_blah_blah, "blah-blah"
first group = blah-blah
temp1 = blah-blah, "blah blah blah", false, false},

所以這意味着{_blah_blah, "blah-blah"將被原始字符串中的blah-blah所取代,其中仍包含, "blah blah blah", false, false, {_blah}, ""},最后。

如果您只想獲得第一個捕獲組,可以使用如上所示的group(1)

編輯

正如twasbrillig的回答所指出的那樣,有兩個替代品。 如果使用count = 0調用re.sub或省略count參數,則替換所有出現的模式,而不僅僅是第一個模式。


旁注:我建議在您的模式中使用原始字符串:

word = r"\W*?[^,\t ]*?\W*?"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM