我是正则表达式的新手,我正在尝试弄清楚如何在数据框中生成一个新列,以捕获名称和姓氏的第一个首字母。
示例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))
答案 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))