2

Nelson, Craig T. 形式的名称需要拆分为

AN Nelson
FN Craig
IT C.T. 

IT表示首字母,注意第一个首字母是FN,名字的第一个字母。

我已经在正则表达式中有一堆模式。对于这个,我怀疑正则表达式不会这样做,原因是:你不能切片反向引用

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 粘贴在它后面。我认为这对于正则表达式是不可能的,我应该使用字符串操作,但是,这不是我第一次在这里学到一个我没有从文档中推断出来的技巧。(多谢你们。)

4

3 回答 3

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而不是首字母。ITrep

于 2013-04-18T21:19:17.820 回答
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)
于 2013-04-18T21:23:58.563 回答
0

我想说哦,没关系,但你们都快了:-)

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)

这只是 Alexey 建议的一个细微变化。在这里,我希望名字的第一个字母 (VN) 使用真正的大写字母。

于 2013-04-19T00:57:22.343 回答