簡體   English   中英

可靠地轉換以逗號/分號分隔的“姓,名,姓,名”列表

[英]Reliably convert comma/semi-colon separated list of “last, first, last, first,” names

我有大量的名稱,其中包含多個名稱的條目用逗號或分號分隔,有時甚至不分隔。 例如:

First Last
Last, First
Last, First, A.
Last, First Middle
Last, First, Last, First A., Last, First, Ph.D, Last, First, M.D., Last, J. R, Last, O.
Last, First Middle plus other names, Last, First, Jr., Last, First, Sr.
Last, First; Last, First A.; Last, First Middle 
First Last, First Last, First A. Last, Last, First

我試圖創建一個函數,當我單獨傳遞每個條目時,它將可靠地返回一個列表,所有內容都按“ First Last”正確排序,並帶有所有可能的后綴,例如Jr,MD等。問題,我有:

def fix_names(names):
    if ',' in names:
        names = [b.strip() + ' ' + a.strip()
                   for a, b in zip(*[iter(names.split(','))] * 2)]
    return names

我想結束於:

['First Last']
['First Last', 'First A. Last', 'First Last, Ph.D', 'First Last, Jr.'] etc

如果我先去除后綴“,MD”而不保留它們,則大多數情況下它都可以工作。 例如舉一個沒有前綴的例子:

Last, First, Last, First A., Last, First, Last, First, Last, J. R., Last, O.

我得到:

['First Last', 'First A. Last', 'First Last', 'First Last', 'J. R. Last', 'O. Last']

還有另一種情況,例如“ Last,First A”。 原來是['First Last']。 對於可能是“第一倒數,第一倒數”的情況,我不必介意它是否被撤消,因為這種情況比較少見,我可以在以后根據需要進行修復。 我也將分號和逗號分開處理,因為我不確定一次拆分是否容易,然后遍歷每個值,如果需要再次拆分,則將其添加到列表中。

這是一個困難的解析問題,但是這里的草圖很合理。

import sys
import re

SUFFIXES = set('''
    Ph.D
    M.D.
    Jr.
    Sr.
'''.split())

regexes = dict(
    punct  = re.compile(r'\s*[;,]\s*'),
    space  = re.compile(r'\s*'),
    middle = re.compile(r'^[A-Z]\.?$'),
)

def main(file_path):
    with open(file_path) as fh:
        for line in fh:
            for name in parse_line(line):
                print name

def parse_line(line):
    tokens = get_tokens(line.strip())
    name = []
    for t in tokens:
        if t in SUFFIXES:
            name.append(t)
        elif regexes['middle'].search(t):
            name.append(t)
        elif len(name) > 1:
            yield name
            name = [t]
        else:
            name.append(t)
    if name:
        yield name

def get_tokens(line):
    k = 'punct' if (';' in line or ',' in line) else 'space'
    return regexes[k].split(line.strip())

main(sys.argv[1])

結果並不完美。 尚不清楚如何在不將更多名稱智能構建到算法中的情況下區分以下三個問題案例注釋(#1,#2和#3)。 當您看到包含空格的令牌時,它是FIRST-MIDDLE組合還是FIRST-LAST組合? 這種模糊性破壞了將令牌分組在一起以形成一個人名字的邏輯。 您可以檢查令牌中的空格:如果它們有空格,則將其拆分(這將解決#2和#3),但會使#1變得更糟。

['First', 'Last']
['Last', 'First']
['Last', 'First', 'A.']
['Last', 'First Middle']
['Last', 'First']
['Last', 'First A.']
['Last', 'First', 'Ph.D']
['Last', 'First', 'M.D.']
['Last', 'J. R']
['Last', 'O.']
['Last', 'First Middle plus other names']    # 1
['Last', 'First', 'Jr.']
['Last', 'First Sr.']
['Last', 'First']
['Last', 'First A.']
['Last', 'First Middle']
['First Last', 'First Last']                 # 2
['First A. Last', 'Last']
['First']                                    # 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM