Как захватить все строки, но избегать строк, содержащих определенное слово или шаблон? Возможен ли захват с негативными взглядами? - PullRequest
1 голос
/ 07 апреля 2020

Данные взяты из таблицы в формате PDF, которая извлекается путем преобразования в текст (с использованием pdftotext). Это пример любопытных данных, из которых я пытаюсь перехватить все строки в python, начиная с district1 до строки с Total (в комплекте), но не содержит пустых строк (^ \ n) или строки с ключевыми словами, такими как Call или Office.

Regex Я пробовал

Также применен флаг DOTALL . Я попытался захватить в python следующим образом: re.findall(r'District.*icts(.*Total.*?\n|\r)',input,re.DOTALL)

District.*icts(.*Total.*?\n|\r)

Вышеприведенное фиксирует (не просто совпадает) все между district1 и Total (включительно). Но я хочу удалить захваченные строки или не захватывать строки, содержащие ключевое слово Call или Office. Поэтому я попытался применить отрицательный прогноз , но он тоже не сработал:

District.*icts(((?!Call|Office|^\n).)*Total.*?\n|\r)

Я был с этой проблемой целый день. У меня нет никакой другой идеи игнорировать эти строки и захватывать остальные. Мы будем благодарны за любую помощь.

ВОЗМОЖНЫЕ ВАРИАЦИИ ВХОДОВ

---dont capture this line----
            District    No. of positive cases admitted        Other Districts
district1                           7                        1 district4
district2                           6
district3                           7                         -


             Call Centre:12323, 132123
                                   Office:212332122 , 1056
  district4                           131
        Total                       263
---dont capture this line----
---dont capture this line----
            District    No. of positive cases admitted        Other Districts
district1                           7                        1 district4
district2                           6


             Call Centre:12323, 132123
                                   Office:212332122 , 1056
district3                           7                         -

  district4                           131
        Total                       263
---dont capture this line----
---dont capture this line----
            District    No. of positive cases admitted        Other Districts
             Call Centre:12323, 132123
district1                           7                        1 district4
district2                           6



                                   Office:212332122 , 1056
district3                           7                         -

  district4                           131
        Total                       263
---dont capture this line----

Требуется захват

district1                           7                        1 district4
district2                           6
district3                           7                         -
  district4                           131
        Total                       263

1 Ответ

0 голосов
/ 07 апреля 2020

Самый простой способ сделать это может быть не с регулярным выражением. Нечто подобное должно работать хорошо:

KEY_WORDS = ["district", "Total"]


def filter_pdf(doc):
    buffer = ''
    for line in doc.split("\n"):
        temp_line = line.strip()  # Remove trailing whitespace
        for word in KEY_WORDS:
            if temp_line.startswith(word):
                buffer += line + "\n"
                break
    return buffer

Это дает ваш вывод:

>>> doc = """
---dont capture this line----
            District    No. of positive cases admitted        Other Districts
district1                           7                        1 district4
district2                           6
district3                           7                         -


             Call Centre:12323, 132123
                                   Office:212332122 , 1056
  district4                           131
        Total                       263
---dont capture this line----
"""
>>> cleaned = filter_pdf(doc)
>>> print(cleaned)
district1                           7                        1 district4
district2                           6
district3                           7                         -
  district4                           131
        Total                       263
...