извлечение имен из строки в Python - PullRequest
0 голосов
/ 29 января 2019

Во-первых, цель состоит в том, чтобы отличать только имена от строки, состоящей из корейских имен, английских имен, специальных символов (-, *, запятая), пробелов и т. Д., И оставить только одно, если имя дублируется.

Итак, на данный момент я взял текстовый файл и преобразовал его в строку, исключив ненужные специальные символы.

import re

path = 'E:\Data Science\Personal_Project\Church\Data\original.txt'

def open_text(path):
    with open(path, "r", encoding='euc-kr') as f:
        text = f.readlines()
        string = ''.join(text)
        unicode_line = string.translate({ord(c): None for c in '.;*\n'})
        cleaned = re.split('-|', unicode_line)


print(unicode_line, type(cleaned))
return(cleaned)

Вот вопрос.Что я хочу добавить к функции выше

1) Если перед пунктирной линией есть буква (например, «Посещаемость ---»), я хочу удалить текст перед ней (например,«Посещаемость»), прежде чем разбить его на тире.

2) Или я хотел бы составить список - [Посещаемость, Отъезд, Отпуск] - и я хотел бы удалить слова, которыевключены в список.

Буду признателен, если вы подскажете лучший или более питонский способ сделать это !!

Для вашего удобства я добавлю образецтекст.

Status of January 20th




** Attendance
-----------

John Smith, John Smith, Bob Smith, Mike Smith, Jane Jones, Daniel Lee, Dong Jones, Jeannie Jones, Jessica Yi, McAleer Chung, Shu K Smith, Song Kim, Steve Carlos, Bob Smith





** Absent
---------

holiday, unauthorized, unpaid leave, emergency
------------------------------------------------------------------------------------------- 
Brown Williams, Paul Garcia

Кроме того, вот мой желаемый вывод только с дублирующимися именами.Если вы видите выше, есть два Джона Смита и два Боба Смита.И наконец, было бы здорово, если бы я мог получить его в алфавитном порядке.

Output:


John Smith, Bob Smith, Mike Smith, Jane Jones, Daniel Lee, Dong Jones, Jeannie Jones, Jessica Yi, McAleer Chung, Shu K Smith, Song Kim, Steve Carlos, Brown Williams, Paul Garcia

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Потенциальное решение:

Предполагается, что формат файла соответствует заданному. Идите по файлу построчно Игнорируйте все строки, где первое и второе слова не пишутся с заглавной буквы. Затем обработайте эту строку как имясписок

for line in file:
  words = line.split(",")

  #No one has just one name like Tupac
  if len(words) > 1:
    #Check to see if first letter of both words are uppercase
    if isUpper(words[0][0]) and isUpper(words[1][0]):
      #name line
      list_to_be_returned+=words

Нечто подобное может быть

0 голосов
/ 29 января 2019
with open(filename)as file:
    words = file.read().split()

также вы можете использовать регулярное выражение

import re

with open(filename)as file:
    words = re.findall(r'([\w]+)', file.read())
0 голосов
/ 29 января 2019

Если я вас правильно понимаю, вы хотите получить set всех имен в документе, без слов в определенных строках заголовка и без слов в предопределенном списке неназванных слов, например «отпуск».

Сначала я бы предложил не объединять все строки, затем вы можете, например, проверить, начинается ли строка с - или *, и исключить эту строку.Это также облегчает пропуск первой строки с заголовком.Затем вы можете просто определить свой список неименованных слов, выполнить цикл по строкам в файле и разделить его на ,.

non_names = set("holiday, unauthorized, unpaid leave, emergency".split(", "))
with open("text.txt") as f:
    next(f) # skip first line
    names = set()
    for line in f:
        if not line.startswith(("*", "-")):
            for name in line.strip().split(", "):
                if name and name not in non_names:
                    names.add(name)

или использовать set непосредственно в сложном выражении генератора:

    names = set(name for line in f
                     if not line.startswith(("*", "-"))
                     for name in line.strip().split(", ")
                     if name and name not in non_names)

В обоих случаях результат равен {'John Smith', 'Jeannie Jones', 'Mike Smith', 'Bob Smith', 'McAleer Chung', 'Steve Carlos', 'Brown Williams', 'Jessica Yi', 'Paul Garcia', 'Jane Jones', 'Shu K Smith', 'Song Kim', 'Daniel Lee', 'Dong Jones'}.Чтобы получить отсортированные имена, просто отсортируйте set, или, если вы хотите отсортировать по фамилии, используйте специальную функцию key:

names = sorted(names, key=lambda s: s.split()[-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...