[英]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
使用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.