bugfix> python > 投稿

テキストからLord | Baroness | Lady | Baronなどのタイトルを持つ一意の名前を抽出し、別のリストと一致させる必要があります。私は正しい結果を得るのに苦労し、コミュニティが私を助けてくれることを願っています。ありがとう!

import re
def get_names(text):
    # find nobel titles and grab it with the following name
    match = re.compile(r'(Lord|Baroness|Lady|Baron) ([A-Z][a-z]+) ([A-Z][a-z]+)')
    names = list(set(match.findall(text)))
    # remove duplicates based on the index in tuples
    names_ = list(dict((v[1],v) for v in sorted(names, key=lambda names: names[0])).values())
    names_lst = list(set([' '.join(map(str, name)) for name in names_]))
    return names_lst
text = 'Baroness Firstname Surname and Baroness who is also known as Lady Anothername and Lady Surname or Lady Firstname.'
names_lst = get_names(text)
print(names_lst)

これは次のようになります: ['Baroness Firstname Surname']

望ましい出力: ['Baroness Firstname Surname', 'Lady Anothername'] しかし、 Lady Surname ではありませんまたは Lady Firstname

次に、このリストと結果を一致させる必要があります。

other_names = ['Firstname Surname', 'James', 'Simon Smith']

要素 'Firstname Surname' をドロップしますこれは、「目的の出力」の男爵夫人の名と姓に一致するためです。

回答 1 件
  • 次の解決策をお勧めします。

    import re
    def get_names(text):
        # find nobel titles and grab it with the following name
        match = re.compile(r'(Lord|Baroness|Lady|Baron) ([A-Z][a-z]+)[ ]?([A-Z][a-z]+)?')
        names = list(match.findall(text))
        # keep only the first title encountered
        d = {}
        for name in names:
            if name[0] not in d:
                d[name[0]] = ' '.join(name[1:3]).strip()
        return d
    text = 'Baroness Firstname Surname and Baroness who is also known as Lady Anothername and Lady Surname or Lady Firstname.'
    other_names = ['Firstname Surname', 'James', 'Simon Smith']
    names_dict = get_names(text)
    print(names_dict)
    #  {'Baroness': 'Firstname Surname', 'Lady': 'Anothername'}
    print([' '.join([k,v]) for k,v in names_dict.items()])
    # ['Baroness Firstname Surname', 'Lady Anothername']
    other_names_dropped = [name for name in other_names if name not in names_dict.values()]
    print(other_names_dropped)
    # ['James', 'Simon Smith']
    
    

あなたの答え