我有一个.csv文件,具有5列和大约5000行。 .csv文件中名为“摘要”的特定列中,有信用卡号和一些文本。看起来像这样
嘿,这项工作需要尽快完成,并用卡号签证5611000043310001支付
我想阅读此列,取出数字(也许使用正则表达式),然后对后4位数字进行掩码,并使用.csv文件中的掩码数字按原样写出整行。
嘿,这项工作需要尽快完成,并用卡号Visa 561100004331 ****支付
我该怎么办?
答案 0 :(得分:1)
使用正则表达式,您可以执行以下操作:
import re
>> s = "hey this job needs to be done asap and pay with card# visa 5611000043310001"
>> re.sub(r"(\d{12})\d{4}",r"\1****",s)
'hey this job needs to be done asap and pay with card# visa 561100004331****'
因此,(\d{12})
基本上与前12位数字匹配(括号内没有替换前12位的数字)。然后是4位数,我们用星号代替。 \1
是第一个组的占位符,被替换省略,因此这里指的是前12位数字。
答案 1 :(得分:0)
下面带有regex的替换功能查找正好16位数字,并屏蔽后4位数字。
所以这段代码:
import docx
import csv
doc = docx.Document()
with open('csv.csv', newline='') as f:
csv_reader = csv.reader(f)
csv_headers = next(csv_reader)
csv_cols = len(csv_headers)
table = doc.add_table(rows=2, cols=csv_cols)
hdr_cells = table.rows[0].cells
for i in range(csv_cols):
hdr_cells[i].text = csv_headers[i]
for row in csv_reader:
row_cells = table.add_row().cells
for i in range(csv_cols):
row_cells[i].text = row[i]
doc.add_page_break()
doc.save("data.docx")
应打印以下内容:
eg_summaries = [
'blah blah card# visa 5611000043310001',
'blah blah card# visa 5611000043310001 with text after',
'5611000043310001',
'visa: 5611000043310001 and random number > 16 digits: 0011237324763246723487243',
]
df = pd.DataFrame({'summary': eg_summaries })
df['summary'].replace(r'\b(\d{12})\d{4}\b', r'\1****', inplace=True, regex=True)
print (df.summary)