用re.sub()部分替换

Mar*_*lez 3 python regex

假设我想在"文本"中找到所有信用卡号,并用XXXX替换前三个4位组,保留最后一组.

我怎么能用re.sub()做到这一点?

到目前为止,我最好的尝试是

re.sub(r"(\d{4}-){3}", "XXXX-XXXX-XXXX-", text)

但当然这种模式会导致非信用卡表达式的替换,如'1234-5678-1234-asdfg'.

Lev*_*sky 6

您可以使用前瞻断言:

re.sub(r"(\d{4}-){3}(?=\d{4})", "XXXX-XXXX-XXXX-", text)
Run Code Online (Sandbox Code Playgroud)

例如:

In [1]: import re

In [2]: text = '1234-5678-9101-1213 1415-1617-1819-hello'

In [3]: re.sub(r"(\d{4}-){3}(?=\d{4})", "XXXX-XXXX-XXXX-", text)
Out[3]: 'XXXX-XXXX-XXXX-1213 1415-1617-1819-hello'
Run Code Online (Sandbox Code Playgroud)

虽然这也符合asdf1234-4567-1234-4567-asdf.