查找带有大写字母的字符串,并在正则表达式中以某个单词结尾

时间:2019-03-20 07:32:41

标签: python regex pandas extract

我有一个数据框,其中一列由具有三种模式的字符串组成:

1)仅大写字母:APPLE COMPANY

2)大写字母,并以字母AS结尾:CAR COMPANY AS

3)大写和小写字母:John Smith

df = pd.DataFrame({'NAME': ['APPLE COMPANY', 'CAR COMPANY AS', 'John Smith']})

             NAME ...
0   APPLE COMPANY ...
1  CAR COMPANY AS ...
2      John Smith ...
3             ... ...

如何取出不满足2)和3),即1)条件的行?换句话说,如何取出仅包含大写大写字母,不以AS结尾或字符串中同时包含大写和小写字母的行?

我想到了这个

df['NAME'].str.findall(r"(^[A-Z ':]+$)")
df['NAME'].str.findall('AS')

第一个提取仅包含大写字母的字符串,但是第二个仅找到AS。如果除了正则表达式之外还有其他方法,我也乐于尝试。

预期结果是:

             NAME ...
1  CAR COMPANY AS ...
2      John Smith ...
3             ... ...

4 个答案:

答案 0 :(得分:3)

一种方式,

df['temp']=df['NAME'].str.extract("(^[A-Z ':]+$)")
s1=df['temp']==df["NAME"]
s2=~df['NAME'].str.endswith('AS')

print(df.loc[~(s1&s2), 'NAME'])

O / P:

1    CAR COMPANY AS
2        John Smith
Name: NAME, dtype: object

答案 1 :(得分:2)

此正则表达式应该起作用:

^(?:[A-Z ':]+ AS|.*[a-z].*)$

它与以下任一匹配:

  • [A-Z ':]+ AS-所有大写字母后跟AS的情况
  • .*[a-z].*-小写字母的情况

Demo

答案 2 :(得分:1)

使用apply和您可能要检查的不同模式:

import re
def myfilter(x):
    patterns = ['[A-Z]*AS$','[A-Z][a-z]{1,}']
    for p in patterns:
        if len(re.findall(p, x.NAME)):
            return True
    return False

selector = df.apply(myfilter, axis=1)

filtered_df = df[selector]

答案 3 :(得分:1)

还可以尝试:

df_new = df[~df['NAME'].str.isupper()|df['NAME'].str.endswith('AS')]