繁体   English   中英

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

[英]Find strings with UPPER case letters and ends with a certain word in regex

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

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             ... ...

一种方法是

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

这个正则表达式应该工作:

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

它与以下任一匹配:

  • [AZ ':]+ AS所有大写字母后跟AS的情况
  • .*[az].* -小写字母

演示版

使用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]

您也可以尝试:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM