切片正则表达式参考?诺坎多?

时间:2013-04-18 21:13:56

标签: python regex slice backreference

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推导出来的技巧。 (谢谢你们。)

3 个答案:

答案 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)的真正资本。