![](/img/trans.png)
[英]How can you use re.sub to replace the content of a capture group with a string?
[英]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))
請注意,您不需要使用括號捕獲整個模式,您可以使用x.group()
訪問整個匹配項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.