我在下面列出了Regex模式和列表中的其他值,以及与该模式有关的其他信息。
Regexes = ['.*PERSONAL[\W]*ACC(((OU)?N)?T|N(UM|BR|O(?![A-Z]))).*', 'ACC INFO', 'IDENTIFICATION INFO', '.*(ADDRESS|(|\b)ADDR)([\W]*LINE|LN)?[\W]\d', 'ADDRESS', 'ADDRESS INFO', '.(_|\b)(GE?NDE?R|SEX|MALE|FEMALE)(_|\b).', 'GENDER INFO', 'BIOGRAPHIC INFO', '(CHE(CK|QUE)|.*CHE(CK|QUE)[_\W]N(UM|BR|O(?![A-Z])).)','INSTRUMENT_NUMBER', 'FINANCIAL INFO']
上面的列表包含正则表达式模式,敏感类型和敏感类别的值。上面的列表只是一个例子,我有超过400种正则表达式模式。
第一个元素是正则表达式模式,第二个元素是senstive_type,第三个元素是senstive_category。
我有一个如下所示的数据框
输入:
+-----------------------------------+---------------------+-------------------+
| NAME |SENSITIVE_TYPE | SENSTIVE_CATEGORY |
+-----------------------------------+---------------------+-------------------+
| PERSONAL_NUMBER | | |
| GENDER FLAG | | |
| SEX_FLAG | | |
| CHECK_NUMBER | | |
| CHECK_NO | | |
| ADDRESS_1 | | |
| ADDRESS_2 | | |
+-----------------------------------+---------------------+-------------------+
因此,代码应遍历数据帧中的NAME列,并且如果NAME列与列表中第一个元素的正则表达式模式匹配,则代码应根据数据中的关联值更新数据帧中的sensitive_type和sensitive_category列。列表。
输出:
+-----------------------------------+---------------------+--------------------+
| NAME |SENSITIVE_TYPE | SENSTIVE_CATEGORY |
+-----------------------------------+---------------------+--------------------+
| PERSONAL_NUMBER | ACC INFO | IDENTIFICATION INFO|
| GENDER FLAG | GENDER INFO | BIOGRAPHIC INFO |
| SEX_FLAG | GENDER INFO | BIOGRAPHIC INFO |
| CHECK_NUMBER | INSTRUMENT NUMBER | FINANCIAL INFO |
| CHECK_NO | INSTRUMENT NUMBER | FINANCIAL INFO |
| ADDRESS_1 | ADDRESS | ADDRESS INFO |
| ADDRESS_2 | ADDRESS | ADDRESS INFO |
+-----------------------------------+---------------------+--------------------+
代码:
import sys
import csv
import re
import pandas as pd
df = pd.read_csv('c:\samples\data.csv')
Regexes = ['.*PERSONAL[_\\W]*ACC(((OU)?N)?T|N(UM|BR|O(?![A-Z]))).*', 'ACC INFO', 'IDENTIFICATION INFO',
'.*(ADDRESS|(_|\\b)ADDR)([_\\W]*LINE|LN)?[_\\W]*\\d*', 'ADDRESS', 'ADDRESS INFO',
'.*(_|\\b)(GE?NDE?R|SEX|MALE|FEMALE)(_|\\b).*', 'GENDER INFO', 'BIOGRAPHIC INFO',
'(CHE(CK|QUE)|.*CHE(CK|QUE)[_\\W]*N(UM|BR|O(?![A-Z])).*)','INSTRUMENT NUMBER', 'FINANCIAL INFO']
regex_pattern= Regexes[0::3]
senstive_category=Regexes[1::3]
senstive_type=Regexes[2::3]
for result in df.NAME:
if re.search(regex_pattern, result):
df.assign(SENSITIVE_CATEGORY=[Regex_cat])
df.assign(SENSITIVE_TYPE=Regex_type)
print(df)
else:
pass
我不确定如何实现上述目标?任何解决方案建议都很好。
注意:整个正则表达式列表也可以创建为一个数据帧,但是我什至不怎么用两个数据帧编码并获得所需的输出。
谢谢
答案 0 :(得分:1)
#Make your regex list a dict
rdict = dict(zip(Regexes[0::3],np.delete(np.asarray(Regexes).reshape(4,3), 0, 1).tolist()))
#get list of keys from dict
keys = [*rdict]
#Check for value then replace
for reg in keys:
df.loc[df['NAME'].str.contains(reg, regex = True), 'SENSITIVE_TYPE'] = rdict[reg][0]
df.loc[df['NAME'].str.contains(reg, regex = True), 'SENSTIVE_CATEGORY'] = rdict[reg][1]
NAME SENSITIVE_TYPE SENSTIVE_CATEGORY
0 PERSONAL_NUMBER ACC INFO IDENTIFICATION INFO
1 GENDER FLAG GENDER INFO BIOGRAPHIC INFO
2 SEX_FLAG GENDER INFO BIOGRAPHIC INFO
3 CHECK_NUMBER INSTRUMENT NUMBER FINANCIAL INFO
4 CHECK_NO INSTRUMENT NUMBER FINANCIAL INFO
5 ADDRESS_1 ADDRESS ADDRESS INFO
6 ADDRESS_2 ADDRESS ADDRESS INFO
虽然不是最优雅的方法,但是一种方法是首先使正则表达式成为字典。然后检查每一行是否包含从键到字典的正则表达式,并将其替换为其对应的值。