正则表达式:在空格前的逗号后提取单词

时间:2021-06-28 07:29:32

标签: regex pandas

我想将 surnamefirst_namesecond_name 提取到我的 df 中的新列中。原始字符串 name 用逗号分隔姓氏和给定的名字。我正在努力处理第一个和第二个名称,因为有时逗号后面有空格。它应该是这样的:

                      name   surname first_name second_name
0  Nancy Katherina, Dorsey    Dorsey      Nancy   Katherina
1              Alan,Harper    Harper       Alan         NaN
2       Charley Max, Sheen     Sheen    Charley         Max
3    Audrey Maria,McKinsey  McKinsey     Audrey       Maria

到目前为止我的方法(只能使 surname 工作):

df['surname'] = df['name'].str.extract(r'^(.+?),', expand=True)

预先感谢您的任何建议!

4 个答案:

答案 0 :(得分:1)

使用 Series.str.split by , 并在其后可选空格并通过索引到新列来选择值:

s = df['name'].str.split(',\s*')
s1 = s.str[0].str.split()

df['surname'] = s.str[-1]
df['first_name'] = s1.str[0]
df['second_name'] = s1.str[1]
print (df)
                       name   surname first_name second_name
0   Nancy Katherina, Dorsey    Dorsey      Nancy   Katherina
1               Alan,Harper    Harper       Alan         NaN
2        Charley Max, Sheen     Sheen    Charley         Max
3     Audrey Maria,McKinsey  McKinsey     Audrey       Maria

答案 1 :(得分:1)

这是正则表达式的常见用法。

我不熟悉您的 panda 环境,但此正则表达式可以满足您的需求:

^\s*(\w+)\s*(\w*)\s*,\s*(.*)\s*$

您可以使用正则表达式测试器进行测试(网上有很多),它可以正确处理逗号后没有第二个名称和空格的情况。

* 量词表示 zro 或更多,所以它会匹配,如果它存在,如果它不存在。括号提供分组以提取您想要的内容。

答案 2 :(得分:1)

正则表达式模式 '(\w+)\s*(\w+)?,\s*(\w+)' 会起作用:

df = pd.DataFrame([{'name': 'Nancy Katherina, Dorsey'},
 {'name': 'Alan,Harper'},
 {'name': 'Charley Max, Sheen'},
 {'name': 'Audrey Maria,McKinsey'}])

df[['first_name', 'second_name', 'surname']] = df['name'].str.extract('(\w+)\s*(\w+)?,\s*(\w+)')
print(df[['name', 'surname', 'first_name', 'second_name']])

                      name   surname first_name second_name
0  Nancy Katherina, Dorsey    Dorsey      Nancy   Katherina
1              Alan,Harper    Harper       Alan         NaN
2       Charley Max, Sheen     Sheen    Charley         Max
3    Audrey Maria,McKinsey  McKinsey     Audrey       Maria

答案 3 :(得分:1)

对于您显示的示例/尝试,请使用 df.str.extract 函数尝试以下代码。

df[["first_name", "second_name", "surname"]] = df['name'].str.extract('^(\S+)(?:\s+(\S+))?,\s*(.*)$', expand=False)
print(df[['name', 'surname', 'first_name', 'second_name']])

说明:为以上添加详细说明。

^(\S+)         ##Matching everything before 1st space(s) occurrences in 1st capturing group.
(?:\s+(\S+))?  ##In a non-capturing group matching spaces followed by non-spaces in 2nd capturing group, keeping this optional.
,\s*           ##Matching comma followed by 0 or more spaces occurrences.
(.*)$          ##Creating 3rd capturing group which has everything till end of value.
相关问题