亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正則表達式用 self 替換

正則表達式用 self 替換

郎朗坤 2023-09-12 17:31:57
我正在使用正則表達式來標記消息中的信息。這些消息的結構是我要查找的某些信息是有序的。然而,某些消息的順序以及我正在查找的特定信息類型可能會根據消息類型而改變。下面是此類消息的一個最小示例message = 'foo 1234567890 bar'假設我知道我的消息包含 3 條我正在尋找的信息:var_a、var_b和var_c。我知道 和var_a是var_c小寫字符串,而var_b是數字,它們按var_a、var_b、 然后var_c在我的消息中的順序出現。我可以使用標記它們r = re.compile('(?P<var_a>[a-z]*)\s+(?P<var_b>[0-9]*)\s+(?P<var_c>[a-z]*)')d = [m.groupdict() for m in r.finditer(message)][0]for key, value in d.items():    message = message.replace(value, f'[{key}]{value}[{key}]')輸出'[var_a]foo[var_a] [var_b]1234567890[var_b] [var_c]bar[var_c]'但是,當我的消息中有重復的單詞時,例如var_a和var_c,即message = 'foo 1234567890 foo'我得到的輸出'[var_a][var_c]foo[var_c][var_a] [var_b]1234567890[var_b] [var_a][var_c]foo[var_c][var_a]'我該如何處理這個問題?我考慮過在正則表達式匹配期間立即替換短語(使用類似 re.sub 的東西),但我似乎不知道如何做到這一點,因為我需要能夠引用我在我的程序中使用的兩個名稱正則表達式(如 var_a 等)以及分配給這些名稱的內容。我想獲得的輸出是'[var_a]foo[var_a] [var_b]1234567890[var_b] [var_c]foo[var_c]'這包括空格(或原始消息中的任何其他類型的文本)。
查看完整描述

2 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

我會re.sub在這里使用:


message = 'foo 1234567890 bar'

output = re.sub(r'\b([a-z]+) (\d+) ([a-z]+)\b', '[var_a]\\1[var_a] [var_b]\\2[var_b] [var_c]\\3[var_c]', message)

print(output)

這打?。?/p>


[var_a]foo[var_a] [var_b]1234567890[var_b] [var_c]bar[var_c]


查看完整回答
反對 回復 2023-09-12
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

的解決方案re.sub可能更優雅,但您也可以使用 來groupdict獲取span各個組的 ,然后替換它們(相反,因為它會改變索引):


m = r.match(message)

msg = list(message)

for k, v in reversed(list(m.groupdict().items())):

    s, e = m.span(k)

    msg[s:e] = list(f"[{k}]{v}[{k}]")


print(''.join(msg))

# '[var_a]foo[var_a] [var_b]1234567890[var_b] [var_c]foo[var_c]'

或者,如果這些組始終僅由空格分隔(并且可以在輸出中用單個空格替換更多空格),您也可以簡單地顯示其中的join項目groupdict(順序應匹配)。


print(" ".join(f"[{k}]{v}[{k}]" for k, v in m.groupdict().items()))


查看完整回答
反對 回復 2023-09-12
  • 2 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號