簡體   English   中英

特定的正則表達式模式匹配Python

[英]Specific regex pattern matching Python

問題
我遇到了一個問題,不幸的是,我對正則表達式還不太熟悉,但是我想解決一個與自動處理文本有關的問題。 實際上,這個問題比我將在下面給出的示例稍微復雜一點,但這主要是為了盡可能簡化它,因為問題在於我的正則表達式功能。

假設我們有一個包含兩種不同類型模式的字符串。 在這種情況下, AABB以及它們在字符串中的隨機位置。 這些模式可以完全隨機順序出現零次或多次。

例如:
"Hello, this AAis just a BB test string. I'm AA here to test BB the regex."

我想要做的是根據以下兩個規則搜索“ test”並將其替換為“ fix”:

  1. 如果在“測試”之前僅找到了AA模式,則“測試”將不會被替換。
  2. 如果在“測試”之前僅找到BB模式,則將“測試”替換為“修復”。
  3. 如果在“測試”之前存在1個或更多的AA和1個或更多的BB ,則在這些多個模式中,BB模式必須排在最后。 在這種情況下,將“測試”替換為“修復”。
  4. 如果未找到任何模式,則“ test”始終替換為“ fix”。

例:
因此,在上面的示例中,單詞“ test”出現了兩次。
第一部分是: "Hello, this AAis just a BB test"
規則編號3適用並通過。 兩種模式都在“測試”之前找到,並以BB結尾。

第二部分是: Hello, this AAis just a BB test string. I'm AA here to test" Hello, this AAis just a BB test string. I'm AA here to test"這里第3條規則適用,但沒有通過。

最終結果是:
"Hello, this AAis just a BB fix string. I'm AA here to test BB the regex."


不同的解決方案:
現在,還有其他方法可以實現此目的。 例如,計算字符串中“測試”的次數,並執行一些for循環,在該循環中,我跟蹤最后一個模式(如果存在)直到找到“測試”並根據最后一個模式采取行動。 重復此過程,直到找到所有“測試”情況,但這確實效率很低。


我對正則表達式解決方案的嘗試
最初,我的問題是一切都很貪婪。 所以[AA]*.*[BB]*.[^AA]+test導致一切,直到字符串中的最后一個“ test”為止,而我只想匹配直到第一個“ test”匹配,然后慢慢迭代直到到最后一個。

因此,我將其修改為: [AA]*?.*[BB]+?[^AA]*?test?
基於正則表達式文檔附加? 使它變得不貪心。
這幾乎是我想要的,涵蓋了規則2和3,但這不適用於規則1。因此,我不太確定如何解決此正則表達式模式。

另外,我將如何遍歷整個字符串的正則表達式模式並在需要時使用re.sub替換單詞?


任何幫助是極大的贊賞。

我不認為嘗試構建單個正則表達式來完成所有事情將是一個富有成果的方法。 相反,讓我們使用多個正則表達式和一些編程來解決問題:

def replace_test(string):
    aa_locs = [(m.start(), "aa") for m in re.finditer(AA, string)]
    bb_locs = [(m.start(),  "bb") for m in re.finditer(BB, string)]
    merged = sorted(aa_locs + bb_locs + [len(string), "end"])
    start = 0
    result = ""
    replacing = False
    for end, pattern_type in merged:
        if replacing:
             result += string[start:end].replace("test", "fix")
        else:
             result += string[start:end]
        if pattern_type == "bb":
             replacing = True
        start = end
    return result

它有點復雜,可能需要清理,但讓我解釋一下這段代碼的作用。 首先,我們想要列出每次狀態更改時的列表,以便將字符串分成我們將替換“ test”一詞的區域和我們不會替換的區域。 我們得到每次找到AA的列表和每次找到BB的列表。 我們將它們存儲為元組(index, pattern) 這樣,我們知道狀態可能發生變化。 之后,我將這些合並為一個列表。 我還添加了一個哨兵值,我們將需要確保稍后確實復制整個字符串。

我們知道初始狀態不會替換,我們從字符串的開頭開始。 在每次迭代中,我們都會提取一部分字符串並將其添加到結果中。 完成此操作后,我們將根據剛剛匹配“ aa”或“ bb”的模式來更新狀態。

暫無
暫無

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

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