【问题标题】:Regex: extract word after comma before whitespace正则表达式:在空格前的逗号后提取单词
【发布时间】:2021-06-28 16:11:35
【问题描述】:

我想将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)

提前感谢您的任何建议!

【问题讨论】:

  • 您最好将第一个中间名和姓氏捕获为一个匹配的单独组。这对你有用吗?

标签: regex pandas


【解决方案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

【讨论】:

    【解决方案2】:

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

    我不熟悉你的 panda 环境,但这个正则表达式会做你想做的事:

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

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

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

    【讨论】:

      【解决方案3】:

      正则表达式模式'(\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
      

      【讨论】:

        【解决方案4】:

        根据您显示的示例/尝试,请尝试以下代码,使用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.
        

        【讨论】:

          猜你喜欢
          • 2023-02-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多