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

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 に答える