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

Posted

技术标签:

【中文标题】在正则表达式中查找带有大写字母并以某个单词结尾的字符串【英文标题】:Find strings with UPPER case letters and ends with a certain word in regex 【发布时间】:2019-08-10 20:11:16 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

它匹配以下任一:

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

Demo

【讨论】:

你的答案是最好的 :),对于基于 pandas 的解决方案 df['NAME'] = df['NAME'].str.extract("(^(?:[A-Z ':]+ AS|.*[a-z].*)$)")【参考方案2】:

一种方法是,

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

【讨论】:

【参考方案3】:

你也可以试试:

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于在正则表达式中查找带有大写字母并以某个单词结尾的字符串的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:匹配包含某个单词的所有单词

如何过滤文本文件中以大写字母开头并以正整数结尾的行,并在 linux 的命令行上使用正则表达式?

匹配以 2 个字母开头并以 3 个字母结尾的正则表达式

正则表达式:数字开头中间字母结尾数字

js正则表达式

JavaScript 正则