问题描述
我创建了一个正则表达式定义,该定义应在名称(空格或逗号)的末尾读取后缀(例如jr / sr / etc),然后如果名称中包含后缀,则返回该名称,然后继续if-then-else语句的下一部分,该语句将对姓氏和名字格式的名称进行拆分并反向连接。我无法弄清楚问题出在哪里...但是re.search函数返回的是所有值,而不仅仅是名称后缀的一部分。请帮忙!
d = {'Person': ['red robin,jr','bluejay,bluie','finch,mustard e','awing blackcrow' ]}
df = pd.DataFrame(data=d)
def separatetypes(name):
if re.search(r'(?:\,|\s+(?:i|ii|iii|iv|jr|sr))*$',name):
return name
elif ',' in name:
namesplit = name.split(',',1)
newname = str(namesplit[1]) + ' ' + str(namesplit[0])
return newname
else:
return name
df['Person'] = df['Person'].apply(separatetypes)
解决方法
您在模式中有一个*
,表示“零次或多次重复”;结果,当发现后缀为零时,它将返回一个匹配项。
您可能想要的模式是r'(?:,|\s+(?:i|ii|iii|iv|jr|sr))$'
(不带*
,并在逗号前省略不必要的\
)或r'(?:,|\s+)(?:i|ii|iii|iv|jr|sr)$'
(允许后缀用逗号分隔,而不是结尾的逗号。
作为一种通用工具,像https://regex101.com/这样的网站(有很多)可以通过解释正在发生的事情并立即显示结果来帮助开发正则表达式。