3

假设我想在“文本”中查找所有信用卡号,并将前三个 4 位数字组替换为 XXXX,最后一组保持不变。

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

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

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

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

4

2 回答 2

6

您可以使用前瞻断言:

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

例如:

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'

虽然这也匹配 asdf1234-4567-1234-4567-asdf 。

于 2013-05-01T22:42:01.110 回答
3

使用反向引用的另一种方法:

data = "4220-1234-9948-2245 is a cc num i have and so is 4153-4222-3942-4852 but dont tell anyone"
print re.sub(r"(\d{4}-){3}(\d{4})", "XXXX-XXXX-XXXX-\\2", data)

# XXXX-XXXX-XXXX-2245 is a cc num i have and so is XXXX-XXXX-XXXX-4852 but dont tell anyone
于 2013-05-01T22:43:33.837 回答