Как я могу удалить цифры, которые могут встречаться в конце слов в тексте - PullRequest
0 голосов
/ 02 января 2019

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

Например, одна строка текста:

Предисловие2 Авторы4 Аббревиатуры5 Благодарности8 Пес терминология10 Уроки, извлеченные из проекта RUPES12 Оплата за экологическая служба и ее потенциал и пример во Вьетнаме16 Глава Интеграция оплаты за экосистемные услуги в политику Вьетнама и программы17 Глава Создание стимула для водораздела Три Ан Защита20 Глава Устойчивое финансирование ландшафтной красоты в Национальный парк Бах Ма 24 Глава Создание механизма оплаты за углерод депонирование в лесном хозяйстве пилотного проекта в районе Цао Фонг Хоа Провинция Бинь, Вьетнам26 Глава 5 Местное распределение доходов Залив Нячанг Морской заповедник Вьетнам28 Синтез и рекомендации30 References32

Первое слово в вышеприведенном тексте должно быть «предисловие» вместо «предисловие2» и т. Д.

line = re.sub(r"[A-Za-z]+(\d+)", "", line)

Это, однако, удаляет слова так же, как видно:

Pes Уроки, извлеченные из RUPES Оплата экологических услуг и это потенциал и пример в главе Интеграция оплаты за экосистемные услуги в политику Вьетнама и глава Создание стимулов для Три водораздела Глава Устойчивое финансирование для ландшафта красота в Национальном парке Бах Ма 24 главы Строительство платежного механизма по улавливанию углерода в лесном хозяйстве пилотный проект в Цао Фонг округ Хоа Бинь Глава 5 Распределение доходов на местном уровне Ня Синтез морской охраняемой зоны залива Транг и

Как я могу захватить только цифры, которые следуют сразу за словами?

Ответы [ 5 ]

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

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

Вот фрагмент:

import re

# I'will write a function that take the test data as input and return the
# desired result as stated in your question.

def transform(data):
    """Replace in a text data words ending with number.""""
    # first, lest construct a pattern matching those words we're looking for
    pattern1 = r"([A-Za-z]+\d+)"

    # Lest construct another pattern that will replace the previous in the final
    # output.
    pattern2 = r"\d+$"

    # Let find all matching words
    matches = re.findall(pattern1, data)

    # Let construct a list of replacement for each word
    replacements = []
    for match in matches:
        replacements.append(pattern2, '', match)

    # Intermediate variable to construct tuple of (word, replacement) for
    # use in string method 'replace'
    changers = zip(matches, replacements)

    # We now recursively change every appropriate word matched.
    output = data
    for changer in changers:
        output.replace(*changer)

    # The work is done, we can return the result
    return output

В целях тестирования мы запускаем указанную выше функцию с вашими данными теста:

data = """
Preface2 Contributors4 Abrreviations5 Acknowledgements8 Pes terminology10 Lessons     
learnt from the RUPES project12 Payment for environmental service and it potential and 
example in Vietnam16 Chapter Integrating payment for ecosystem service into Vietnams 
policy and programmes17 Chapter Creating incentive for Tri An watershed protection20 
Chapter Sustainable financing for landscape beauty in Bach Ma National Park 24 Chapter 
Building payment mechanism for carbon sequestration in forestry a pilot project in Cao 
Phong district of Hoa Binh province Vietnam26 Chapter 5 Local revenue sharing Nha Trang 
Bay Marine Protected Area Vietnam28 Synthesis and Recommendations30 References32
"""

result = transform(data)

print(result)

И результат выглядит так:

Preface Contributors Abrreviations Acknowledgements Pes terminology Lessons learnt from 
the RUPES project Payment for environmental service and it potential and example in 
Vietnam Chapter Integrating payment for ecosystem service into Vietnams policy and 
programmes Chapter Creating incentive for Tri An watershed protection Chapter 
Sustainable financing for landscape beauty in Bach Ma National Park 24 Chapter Building 
payment mechanism for carbon sequestration in forestry a pilot project in Cao Phong 
district of Hoa Binh province Vietnam Chapter 5 Local revenue sharing Nha Trang Bay 
Marine Protected Area Vietnam Synthesis and Recommendations References
0 голосов
/ 02 января 2019

Попробуйте это:

line = re.sub(r"([A-Za-z]+)(\d+)", "\\2", line) #just keep the number    
line = re.sub(r"([A-Za-z]+)(\d+)", "\\1", line) #just keep the word
line = re.sub(r"([A-Za-z]+)(\d+)", r"\2", line) #same as first one    
line = re.sub(r"([A-Za-z]+)(\d+)", r"\1", line) #same as second one

\\ 1 будет соответствовать слову, \\ 2 число.См .: Как использовать регулярные выражения Python для замены с использованием захваченной группы?

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

Вы также можете создать диапазон чисел:

re.sub(r"[0-9]", "", line)
0 голосов
/ 02 января 2019

Вы можете захватить текстовую часть и заменить слово этой захваченной частью. Просто пишет:

re.sub(r"([A-Za-z]+)\d+", r"\1", line)
0 голосов
/ 02 января 2019

Вы можете попробовать косвенные утверждения, чтобы проверить слова перед своими номерами. Попробуйте использовать границы слов (\ b) в конце, чтобы ваше регулярное выражение совпадало только с числами в конце слова:

re.sub(r'(?<=\w+)\d+\b', '', line)

Надеюсь, это поможет

EDIT: Извините за глюк, упомянутый в комментариях о совпадающих числах, которым также НЕ предшествуют слова. Это потому, что (извините еще раз) \ w соответствует буквенно-цифровым символам, а не только буквенным. В зависимости от того, что вы хотите удалить, вы можете использовать положительную версию

re.sub(r'(?<=[a-zA-Z])\d+\b', '', line)

только для проверки на наличие букв английского алфавита (вы можете добавить символы в список [a-zA-Z]) перед вашим номером или отрицательной версией

re.sub(r'(?<![\d\s])\d+\b', '', line)

, чтобы соответствовать чему-либо, что НЕ \ d (числа) или \ s (пробелы) перед вашим желаемым числом. Это также будет соответствовать знакам препинания.

...