如何在正则表达式中添加条件?

2024-06-01 01:40:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在到处寻找,但我还没有找到任何解决办法。。。 例如,我的数据框中有一个名字列表,比如:佩内洛普·迪恩斯、科琳·M·珀塞尔、萨利·西伯恩、特蕾莎·T·阿兰达等等。 我当前的正则表达式是

^[A-Z][a-z]+,?\s+(?:[A-Z][a-z]*\.?\s*)?[A-Z][a-z]+

这抓住了大部分的名字。然而,在数据框中,我也有类似“XXX的特许房地产,YYY的数字营销人员”这样的行。上述Regex还包括“特许房地产”和“数字营销人员”。我只想选择只有名称的行,我该怎么做?我可以写正则表达式来不捕捉任何包含“at”的单词吗

++++

所以我正在处理一列多行的数据帧, 数据帧如下所示:

lst = [Penelope Deans, 1/1/2020, Digital Marketer at XXX, Corinne M. Percell, 1/1/2020, Tereasa T., Licensed Real Estate at YYY]

df = pd.DataFrame(lst)

df

    Info 
0  Penelope Deans 
1  1/1/2020 
2  Digital Marketer at XXX 
3  Corinne M. Percell 
4  1/1/2020 
5  Tereasa T. 
6  Licensed Real Estate at YYY

name_pat = r"^[A-Z][a-z]+,?\s+(?:[A-Z][a-z]*\.?\s*)?[A-Z][a-z]+"
df['Info'].str.findall(name_pat)

输出是

    Info 
0  Penelope Deans 
1  []
2  Digital Marketer
3  Corinne M. Percell 
4  [] 
5  Tereasa T. 
6  Licensed Real Estate

我期待的是:

    Info 
0  Penelope Deans 
1  []
2  []
3  Corinne M. Percell 
4  []
5  Tereasa T. 
6  []

Tags: 数据inforealatxxxdigitalpenelopeyyy
1条回答
网友
1楼 · 发布于 2024-06-01 01:40:46

关键是决定什么决定了一个值是名称,什么不是名称

从您的示例中,似乎'Penelope Deans''Corinne M. Percell''Tereasa T.'是名称,而'1/1/2020'不是名称(因为它有数字和斜杠),而'Digital Marketer at XXX'也不是,因为它遵循<namelike> at <namelike>模式

请注意,根据这些规则'John at Smith'也不会是名称。但是,由于“at”在英语中不是一个普通的贵族语气词,所以它应该能起作用,而且你也不希望专门涵盖外国名字(即使这样,“at”在名字中也很少见)

使用正则表达式的Python解决方案:

import pandas as pd

lst = [
    'Penelope Deans', '1/1/2020', 'Digital Marketer at XXX', 'Corinne M. Percell', 
    '1/1/2020', 'Tereasa T.', 'Licensed Real Estate at YYY'
]

df = pd.DataFrame(lst)

df = df[df[0].str.match('^((?! at )[A-z\s\.])+$')]

print(df)

结果:

                    0
0      Penelope Deans
3  Corinne M. Percell
5          Tereasa T.

相关问题 更多 >