Соответствие нескольких слов до конца документа - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь использовать Regex для анализа резюме. Я пытаюсь найти раздел, озаглавленный «Образование» (или некоторая форма), а затем использовать правила, чтобы определить конец блока.

В настоящее время у меня есть работающее регулярное выражение, которое найдет слово «образование» и даст мне остальную часть документа для анализа на основе правил.

это мой полный код, который определяет правила

headers = ['experience','projects','work experience','skills 
summary','skills/tools']
for item in resume_paths:
    resume = getText(item)
    resume = resume.replace('\n',' \n ')
    education = re.findall(r'(?i)\w*Education\w*[^?]+', resume)[0].split('\n')
    paragraph = ''
    for line in education[1:]:
         line = line.strip()
         if (line.isupper() == False) and (not line.strip().lower() in headers):
            paragraph += line + '\n'
        else:
            break
    print(resume[:15],paragraph)

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

(?i)\w*Education\w*[^?]+

У меня возникают проблемы, когда кто-то использует слово «образование» несколько раз. Я хочу, чтобы регулярное выражение возвращало список всех совпадений в конец документа и будет использовать правила, чтобы определить, какое из них является правильным. Я попытался удалить знак +, чтобы получить несколько совпадений, но это дает мне оба совпадения слов без остальной части документа.

Спасибо !!

1 Ответ

0 голосов
/ 03 июля 2019

Ваше регулярное выражение r '(? I) \ w Образование \ w [^?] +' Найдет «Образование», необязательно с дополнительными буквами и цифрами с обеих сторон;затем продлите это до следующего знака вопроса.\ w не будет включать пробелы, знаки пунктуации и т. д.

Я сомневаюсь, что это то, что вы хотите.Было бы получить такие вещи, как:

XYZEducationismallly

, но не

Relevant Education

[^?] Означает что-то, что не '?';но я не понимаю, почему вы хотите отсканировать до следующего знака вопроса (или конца строки).

Кроме того, если нет "?"примерно (как это вероятно), это "+" приведет все к концу всей исходной строки - но вы, вероятно, хотите остановиться на следующем заголовке (если есть), таком как "История занятости" или что-то еще.

На самом деле сделать это правильно будет сложно, потому что резюме могут быть преобразованы в текст разными способами (один очевидный пример: каждая из строк текста может представлять одну «визуальную» строку из оригинала или один «абзацный» блок)или даже одну ячейку таблицы, если создатель использовал таблицы для разметки (как это обычно бывает).

Но если вы застряли в работе с текстом, возможно, более ясный и простой способ выглядит так:

eduSection = []
inEducationSection = False
for line in resume:
    if re.search(r'\bEducation', line): 
        inEducationSection = True
    elif re.search(r'\b(History|Experience|other headingish things)', line):
        inEducationSection = False
    elif inEducationSection:
        eduSection.append(line)

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

* headings might be all caps, or title caps;
* headings might be  the only things that start in column1
* headings might have no punctuation except final ':'
* headings might be really short compared to (most) other lines
* maybe there are only a few dozen distinct headings that show up often.

Я бы сказал, что первое, что нужно выяснить, это как определить, когда что-то движется.Если у вас есть это, все остальное довольно просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...