试图检查Python中的String是否遵循正确的模式(良好的格式)

时间:2016-06-27 12:46:28

标签: python python-3.x pandas match

我有一个包含带字符串的列的数据集。其中一列包含标识符。现在我想检查该标识符是否遵循这种模式:例如AB12CD,所以2个字母(大写),2个数字后跟2个字母。

数据存储在pandas数据框中。我有:

for i in range(0, len(data.columns)):
    if data.columns[i] == 'identifier ':
        pattern = re.compile("[A-Z][A-Z][0-9][0-9][A-Z][A-Z]")
        if pattern.match(data.ix[i, 0]):
            data['identifier Check'] = 'Ok'
        else:
            data['identifier  Check'] = 'identifier Format incorrect'

但这不起作用。它放在每一行OK或Corp Key不正确。取决于第一行。

任何人都可以帮助我吗? 谢谢!

1 个答案:

答案 0 :(得分:2)

您的代码没有按预期工作,因为data['identifier Check'] = 'Ok'会将'Ok'分配给identifier Check列中的每一行。

您的代码也会按列而不是逐行扫描DataFrame(即它会检查每列的第一行中的值,而不是检查每行的特定列中的值)。

我的解决方案定义了一个函数,该函数在给定字符串和模式的情况下返回所需的输出。

使用apply具有的pandas.Series方法调用此函数。在这种情况下,它将覆盖data['identifier']列中的每个项目并将其发送到check_identifier函数。 data['identifier'].apply(check_identifier)的结果将是np.array,然后将其分配给DataFrame中新创建的identifier Check列。

# abusing the fact that default arguments are evaluated only during function definition
def check_identifier(value, pattern=re.compile("[A-Z][A-Z][0-9][0-9][A-Z][A-Z]")):
    return 'OK' if pattern.match(value) else 'identifier Format incorrect'

data['identifier Check'] = data['identifier'].apply(check_identifier)

一个例子:

def check_identifier(value, pattern=re.compile("[A-Z][A-Z][0-9][0-9][A-Z][A-Z]")):
    return 'OK' if pattern.match(value) else 'identifier Format incorrect'

df = pd.DataFrame({'a':['AB12CD', 'AB12Cd']})
print(df)
>>         a             
   0  AB12CD
   1  AB12Cd

df['identifier Check'] = df['a'].apply(check_identifier)

print(df)
>>           a             identifier Check
   0  AB12CD                           OK
   1  AB12Cd  identifier Format incorrect