簡體   English   中英

不能在 re.sub() repr 表達式中的 function 調用中使用 '\1' 反向引用來捕獲組

[英]Can't use '\1' backreference to capture-group in a function call in re.sub() repr expression

我有一個字符串S = '02143'和一個列表A = ['a','b','c','d','e'] 我想用列表A中的相應元素替換 'S' 中的所有這些數字。

例如,將0替換為A[0] ,將2替換為A[2]等等。 最終 output 應該是S = 'acbed'

我試過了:

S = re.sub(r'([0-9])', A[int(r'\g<1>')], S)

但是,這會給出錯誤ValueError: invalid literal for int() with base 10: '\\g<1>' 我猜它正在考慮將反向引用'\g<1>'作為字符串。 我該如何解決這個問題,特別是使用re.sub和 capture-groups,或者?

re.sub(r'([0-9])',A[int(r'\\g<1>')],S)不起作用的原因是\\g<1> (這是一個明確的第一個反向引用的表示,否則寫為\\1 )反向引用僅在字符串替換模式中使用時才有效。 如果你將它傳遞給另一個方法,它只會“看到” \\g<1>文字字符串,因為re模塊當時沒有任何機會評估它。 re引擎僅在匹配期間對其進行評估,但在re引擎嘗試查找匹配之前評估A[int(r'\\g<1>')]部分。

這就是為什么可以在re.sub中使用回調方法作為替換參數的原因:您可以將匹配的組值傳遞給任何外部方法以進行高級操作。

請參閱re文檔

re.sub(pattern, repl, string, count=0, flags=0)

如果repl是一個函數,則每次出現不重疊的pattern都會調用它。 該函數采用單個匹配對象參數,並返回替換字符串。

利用

import re
S = '02143' 
A = ['a','b','c','d','e']
print(re.sub(r'[0-9]',lambda x: A[int(x.group())],S))

查看Python 演示

請注意,您不需要使用括號捕獲整個模式,您可以使用x.group()訪問整個匹配項。

暫無
暫無

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

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