正则表达式,捕获第一个单词和最后一个单词的第一个字母

时间:2018-06-06 08:34:10

标签: python regex

我是正则表达式的新手,我正在尝试弄清楚如何在数据框中生成一个新列,以捕获名称和姓氏的第一个首字母。

示例df

Name           NormName
john smith     j smith
s r peterson   s peterson
sandra oh      s oh

这是我到目前为止尝试的代码,但似乎无法让它工作。我不知道如何只更换中间部分。

namereg = re.compile('(^[a-z])(.*)(\s[a-z]*$)')
names['NormName'] = names.Name.apply(lambda tmp: namereg.sub('',tmp))

4 个答案:

答案 0 :(得分:5)

我认为你甚至不需要使用正则表达式:

names['NormName'] = names.Name.apply(lambda tmp: tmp[0]+" "+tmp.rpartition(" ")[2])

答案 1 :(得分:1)

这应该有效,请根据您的需要进行调整。

import re
name="john smith"
PATTERN=r'^(\w).*(\s+\w+)$'
MATCH=re.search(PATTERN, name)
print(MATCH.group(1)+MATCH.group(2)

答案 2 :(得分:0)

您可以使用

M

请参阅regex demo

模式详情

  • names['NormName'] = names['Name'].str.replace(r'^([a-z]).*\s([a-z]+)$', r'\1 \2') - 字符串开头
  • ^ - 第1组(在替换模式中称为([a-z]) placeholer):一个小写的ASCII字母
  • \1 - 任意0个字符到最后一个空格
  • .*\s - 第2组(用替换模式中的([a-z]+) placeholer引用):1+小写ASCII字母...
  • \2 - 字符串的结尾。

Python演示:

$

答案 3 :(得分:0)

尝试使用re.sub。这里^(\ w)第一个字母,(\ b \ w + \ b $)最后一个字。

df['NormName']=df.Name.apply(lambda x: re.sub(r'^(\w).*(\b\w+\b$)',r'\1 \2',x))