如何根据字符串和特殊字符过滤pd.Dataframe?

时间:2020-05-21 18:49:26

标签: python regex string pandas special-characters

这就是我所拥有的:

import re
import pandas as pd
d = {'ID': [1, 2, 3, 4, 5], 'Desc': ['0*1***HHCM', 'HC:83*20', 'HC:5*2CASL', 'DM*72\nCAS*', 'HC:564*CAS*5']}
df = pd.DataFrame(data=d)
df

Output:

   ID          Desc
0   1    0*1***HHCM
1   2      HC:83*20
2   3    HC:5*2CASL
3   4   DM*72\nCAS*
4   5  HC:564*CAS*5

如果数据框包含未用字母或数字包围的“ CAS”或“ HC”,我需要按“ Desc”列过滤数据框。

这是我尝试过的:

new_df = df[df['Desc'].str.match(r'[^A-Za-z0-9]CAS[^A-Za-z0-9]|[^A-Za-z0-9]HC[^A-Za-z0-9]') == True]

它返回一个空的数据框。

我希望它返回以下内容:

   ID          Desc
1   2      HC:83*20
2   3    HC:5*2CASL
3   4   DM*72\nCAS*
4   5  HC:564*CAS*5

另一件事:由于第三行具有“ \ nCas”,其中“ \ n”是行分隔符,是否会将其视为在“ CAS”之前的字母?

请帮助。

2 个答案:

答案 0 :(得分:1)

尝试一下:

df.loc[df['Desc'].str.contains(r'(\W|^)(HC|CAS)(\W|$)', flags=re.M)]

# If you don't want to import re you can just use flags=8:

df.loc[df['Desc'].str.contains(r'(\W|^)(HC|CAS)(\W|$)', flags=8)]

结果:

   ID          Desc
1   2      HC:83*20
2   3    HC:5*2CASL
3   4   DM*72\nCAS*
4   5  HC:564*CAS*5

要回答另一个问题,只要正确传递了\n,它将被解析为换行符,而不是字母数字字符n。即:

r'\n' -> `\\n` (backslash character + n character)
'\n' -> '\n'   (newline character)

有关正则表达式的进一步说明,请参见Regex101演示:https://regex101.com/r/FNBgPV/2

答案 1 :(得分:0)

您可以尝试这样做,它只检查CAS和HC之前的数字和字母,但是您也可以轻松地将其修改为:

print(df[~df['Desc'].str.contains('([0-9a-zA-Z]+CAS*)|([0-9a-zA-Z]+HC*)', regex=True)])

   ID          Desc
1   2      HC:83*20
3   4   DM*72\nCAS*
4   5  HC:564*CAS*5