Почему моя программа не обнаруживает здесь слова «Адрес:» или «Профессионал:»? - PullRequest
1 голос
/ 04 мая 2019

Я пытаюсь найти простой текст в этой конфигурации:

Named H Man, MBA
Personal: 
Address: 
Professional: 
0000 Something St 
Apt 000 
City, ST 12345-6789 
No Business Contact Information. 
Academic: 
2019 Bachelors, Education - AF s

Моя цель - получить только первую часть адреса в этом тексте, части «0000 Something St» и «Apt 000». Это осложняется тем фактом, что некоторые записи в незашифрованном виде настраиваются по-разному, поэтому я использую более общий метод: я пытаюсь найти строки, содержащие слово «Address:» или «Professional:», чтобы получить строку, которая начинает ту часть текста, которую я хочу, а затем найти любую строку после нее, которая содержит запятую в качестве конца. После того, как это сработает, я напишу код, чтобы потом удалить все, что мне не нужно, из этих строк. Большинство текстов работают с программой как написано - только этот ничего не выводит, я думаю, это потому, что он по какой-то причине неправильно определяет слова «Address:» или «Professional:».

Код, который я написал до сих пор, таков, плюс метод вывода их потом, который не может быть проблемой:

def FindAddress(person):
    global address
    address = "NA"
    addressUncropped = ""
    lineBeforeAddress = 0
    lineAfterAddress = 0
    personLines = person.splitlines()
    wordList = []
    lineIndex = 0
    for line in personLines:  # This sets up the before and after markers to be used later
        wordList = line.split(" ")
        for word in wordList:
            print(word)
            if word == "Address:" or word == "Professional:" and lineBeforeAddress == 0:
                lineBeforeAddress = lineIndex
            if "," in line and lineAfterAddress == 0 and lineIndex >= lineBeforeAddress:
                lineAfterAddress = lineIndex+1
        lineIndex += 1
    for line in personLines[lineBeforeAddress:lineAfterAddress]:  # This uses the before and after markers to get the address
        addressUncropped += line

Если у вас есть какой-либо другой не связанный совет, который может помочь с этой задачей, я также хотел бы услышать это. Спасибо!

Ответы [ 2 ]

2 голосов
/ 04 мая 2019

Проблема в том, что это условие истинно в первой строке:

if "," in line and lineAfterAddress == 0 and lineIndex >= lineBeforeAddress:

Первая строка содержит запятую в Named H Man, MBA. lineAfterAddress и lineBEforeAddress оба равны нулю, поэтому lineIndex >= lineBeforeAddress имеет значение true. Вам нужно проверить, что lineBeforeAddress установлено, поэтому вам также нужно условие lineBeforeAddress > 0.

Кроме того, этот тест не должен быть в цикле for word in wordList, поскольку он просто проверяет всю строку, а не отдельные слова.

Цикл в конце может быть упрощен до:

addressUncropped = "".join(personLines[lineBeforeAddress:lineAfterAddress])

Полный код:

def FindAddress(person):
    global address
    address = "NA"
    addressUncropped = ""
    lineBeforeAddress = 0
    lineAfterAddress = 0
    personLines = person.splitlines()
    wordList = []
    lineIndex = 0
    for line in personLines:  # This sets up the before and after markers to be used later
        wordList = line.split(" ")
        for word in wordList:
            if (word == "Address:" or word == "Professional:") and lineBeforeAddress == 0:
                lineBeforeAddress = lineIndex
        if "," in line and lineAfterAddress == 0 and lineBeforeAddress > 0 and lineIndex >= lineBeforeAddress:
            lineAfterAddress = lineIndex+1
        lineIndex += 1
    addressUncropped = "".join(personLines[lineBeforeAddress:lineAfterAddress])
    return addressUncropped
0 голосов
/ 04 мая 2019

Я не просматривал ваш код, но если вы просто хотите найти индексы строк, которые начинаются с "Address:" или Professional:", вы можете просто сделать:

[i for i,l in enumerate(person.splitlines()) if l.startswith("Address:") or l.startswith("Professional:")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...