Python 数据帧正则表达式

Python 数据帧正则表达式,python,pandas,dataframe,Python,Pandas,Dataframe,我在下面的列表中列出了正则表达式模式和列表中的其他值,以及与该模式相关的其他信息 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)

我在下面的列表中列出了正则表达式模式和列表中的其他值,以及与该模式相关的其他信息

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个正则表达式模式

第一个元素是regex模式,第二个元素是senstive_类型,第三个元素是senstive_类别

我有一个如下所示的数据框

输入:

+-----------------------------------+---------------------+-------------------+
| NAME                              |SENSITIVE_TYPE       | SENSTIVE_CATEGORY |
+-----------------------------------+---------------------+-------------------+
| PERSONAL_NUMBER                   |                     |                   |
| GENDER FLAG                       |                     |                   |
| SEX_FLAG                          |                     |                   |
| CHECK_NUMBER                      |                     |                   |
| CHECK_NO                          |                     |                   |
| ADDRESS_1                         |                     |                   |
| ADDRESS_2                         |                     |                   |
+-----------------------------------+---------------------+-------------------+   

因此,代码应该在数据帧中的NAME列中循环,如果NAME列与列表中第一个元素的regex模式匹配,那么代码应该根据列表中的关联值更新数据帧中的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       |
+-----------------------------------+---------------------+--------------------+

代码:

我不知道如何实现上述目标?任何解决方案的建议都很好

注意:整个Regex列表也可以创建为一个数据帧,但我甚至不知道如何使用两个数据帧编码并获得所需的输出

谢谢


虽然不是最优雅的方法,但有一种方法是首先让正则表达式列出一个dict。然后检查每一行是否包含dict键的正则表达式,并将其替换为相应的值。

同样适用于
'.*PERSONAL[\uw]*ACC((OU)?N)?T|N(UM|BR|O(?![a-Z])。*'
(在ACC之后应该在ACC之前。这太棒了。解决方案非常有效。非常感谢您提供的解决方案。
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
#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