多种形式文本格式上的正则表达式文本清理

2024-04-28 15:58:47 发布

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

我有一个具有多种形式名称的数据框:

JOSEPH W. JASON
Ralph Landau
RAYMOND C ADAMS
ABD, SAMIR
ABDOU TCHOUSNOU, BOUBACAR
ABDL-ALI, OMAR R

对于前三个,规则是最后一句话。对于最后三个或任何带有逗号的单词,第一个单词是姓氏。然而,对于像Abdou Tchousnou这样的名字,我只记住了最后一个词,那就是Tchousnou

预期产量为

JASON
LANDAU
ADAMS
ABD
TCHOUNOU
ABDL-ALI

左边是名字,右边是我想要返回的

str.extract(r'(^(?=[^,]*,?$)[\w-]+|(?<=, )[\w-]+)', expand=False)

有没有办法解决这个问题?当前代码只返回名字,而不是我想要的姓氏


Tags: 数据名称ali名字单词姓氏jasonjoseph
2条回答

您可以使用此正则表达式提取:

>>> print (df)
                       name
0           JOSEPH W. JASON
1              Ralph Landau
2           RAYMOND C ADAMS
3                ABD, SAMIR
4  ABDOU TCHOUSNOU, BOUBACA
5          ABDL-ALI, OMAR R

>>> df['name'].str.extract(r'([^,]+(?=,)|\w+(?:-\w+)*(?=$))', expand=False)
0            JASON
1           Landau
2            ADAMS
3              ABD
4  ABDOU TCHOUSNOU
5         ABDL-ALI

正则表达式详细信息:

  • (:启动捕获组
    • [^,]+(?=,):匹配1+个非逗号字符
    • |:或
    • \w+:匹配1+个单词字符
    • (?:-\w+)*:匹配-后跟1+个单词字符。匹配此组中的0个或多个
  • ):结束捕获组
  • (?=,|$):Lookahead断言前面有逗号或行尾

类似这样的方法会奏效:

(.+(?=,)|\S+$)
  • (-启动捕获组#1
  • .+(?=,)-在逗号之前获取所有内容
  • |-或
  • \S+$-在行尾之前获取所有不是空白的内容
  • )-末端捕获群#1

https://regex101.com/r/myvyS0/1

Python:

str.extract(r'(.+(?=,)|\S+$)', expand=False)

相关问题 更多 >