Nelson,Craig T.形式的名字需要分成
AN Nelson
FN Craig
IT C.T.
IT表示首字母,注意第一个首字母是FN的第一个字母,名字。
我在regex中已经有很多模式。对于这个,我怀疑正则表达式不会这样做,原因是:你不能切换反向引用
import re
name = r'Nelson, Craig T.'
pat = r'([^\W\d_]+),\s([^\W\d_]+\s?)\s(([A-Z]\.?)+)\s?$'
rep = r'AN \1\nVN \2\nsf \3\n'
split = re.sub(pat, rep, name)
print(split)
将产生:
AN Nelson
FN Craig
IT T.
理想情况下,我会以某种方式切片\ 2,添加一个句号并在其后面粘贴\ 3。我认为这对于正则表达式是不可能的,我应该使用字符串操作,但是,这不是我第一次在这里学习一个我没有从documentation推导出来的技巧。 (谢谢你们。)
答案 0 :(得分:4)
您可以使用另外一组作为第一个首字母:
pat = r'([^\W\d_]+),\s(([^\W\d_])[^\W\d_]*\s?)\s(([A-Z]\.?)+)\s?$'
rep = r'AN \1\nVN \2\nIT \3.\4\n'
我还更正了sf
变量中的首字母IT
代替rep
。
答案 1 :(得分:1)
而不是替换,玩组
import re
name = r'Nelson, Craig T.'
pat = r'([^\W\d_]+),\s([^\W\d_]+\s?)\s(([A-Z]\.?)+)\s?$'
fmt = 'AN {last}\nVN {first}\nsf {initials}\n'
mtch = re.match(pat, name)
last_name, first_name, mid_name = mtch.group(1, 2, 3)
parsed = fmt.format(last=last_name, first=first_name, initials=last_name[0]+'.'+mid_name)
print(parsed)
答案 2 :(得分:0)
我打算说O没关系,但你们都快了:-)
import re
name = r'Nelson, Craig T.'
pat = r'([^\W\d_]+),\s(([A-Z])[^\W\d_]+\s?)\s(([A-Z]\.?)+)\s?$'
rep = r'AN \1\nVN \2\nsf \3.\4\n'
split = re.sub(pat, rep, name)
print(split)
这只是阿列克谢的建议略有不同。在这里,我更喜欢第一个名字(VN)的真正资本。