簡體   English   中英

在Python中的相同邊界內替換多個模式

[英]Replace multiple patterns inside the same boundaries in Python

搜索文字:

{ Field1:Value Field2:Value Field1:Value }

然后,我想查找和替換Field的每個實例,當它等於某個值時,但僅當該字段位於{&}邊界內時。

注意:在{之后但在第一個字段之前,可以有空白。 和數量不等的領域。

正則表達式:

({\s*)(?:Field1)(:(?:.*?)})

使我可以將文本分成幾組,使我可以使用不同的字段名稱重新創建新文本。

例如:

\1Field3\2

但是,這將僅匹配Field1的第一個實例,而忽略第二個實例,因為正則表達式引擎從結束處繼續}

我考慮過然后使用Lookbehind和Lookahead,購買Python不支持這些方法的變量重復,所以就不行了。

“ re.sub”方法返回文本,如果找到/替換了正則表達式,則將更改文本,但實際上並沒有說明是否執行了替換操作,因此,除非找到匹配項,否則我什至無法循環播放第二個正則表達式,以驗證哪個感覺不正確。

有什么辦法可以在單個正則表達式中做到這一點嗎?

-----編輯-----

盡管仍然處於多個階段,但我還是設法將Emmanuel&Ωmega的解決方案都提取了出來,但是我認為在這種情況下,多個步驟是唯一的解決方案。

伊曼紐爾代碼(適用於我的解決方案)

s = '{ Field1:Value Field2:Value Field1:Value } Field1:Value {Field1:Value}'
for insider in re.findall(r'{\s*Field1:.*?}', s):
    new = re.sub(r'Field1:', r'NewField:', insider)
    s = s.replace(insider, new)

Ωmega的代碼(適用於我的解決方案)

def evaluate(m):
  return re.sub('Field1:', 'NewField:', m.group(0))
input = '{ Field1:Value Field2:Value Field1:Value } Field1:Value {Field1:Value}'
output = re.sub('{[^{}]*?}', evaluate, input)

Python確實在前瞻性斷言中支持無限重復。 所以,除非你有嵌套{ / }結構(這是不可能的Python的正則表達式引擎來處理),你可以簡單地檢查下后面括號是否是一個右括號:

>>> import re
>>> subject = "{Field1:Value Field2:Value} Field3:Value {Field4:Value}"
>>> re.sub(r"Field(\d+):(\w+)(?=[^{}]*\})", r"NewField\1:\2", subject)
'{NewField1:Value NewField2:Value} Field3:Value {NewField4:Value}'
def evaluate(m):
  return re.sub(r'(\w+):(' + re.escape(value) + r'\b)', field + ":\\2", m.group(0))

output = re.sub(r'\{[^{}]*\}', evaluate, input)

看到這個演示

蒂姆的答案確實很棒。 我的開采分為兩個步驟:

  • 在括號之間獲取所有內容
  • 循環所有它們以進行有效替換

這給出:

>>> s = '{ Field1:Value Field2:Value Field1:Value } Field4:Value {Field5:Value    }'
>>> for insider in re.findall(r'{((?:\s*Field\d+:Value\s*)*)}', s):
    new = re.sub(r'\s*Field(\d+):(\w+)\s*', r' NewField\1:\2', insider)
    s = s.replace(insider, new)

>>> s
'{ NewField1:Value NewField2:Value NewField1:Value} Field4:Value { NewField5:Value}'

暫無
暫無

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

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