Регулярное выражение для извлечения фракций - PullRequest
1 голос
/ 07 апреля 2020

Я ищу регулярное выражение для соответствия фракциям формата [0-9]\/[1-9]{1,2} в данной строке.

Ниже приведен пример:

my_str = "This is a 1/2 1/4. Press 1/2/3. He drove a car for 1/2hour." # A free text

def replace_fractions(text):
    fraction_dict = {
        '1/2': 'half',
        '1/4': 'quarter',
        '3/4': 'three quarters',
        '2/3': 'two thirds',
    }
    _tmp = ' '.join([fraction_dict.get(w, w).strip() for w in text.split()])
    return _tmp

current_result = replace_fractions("This is a 1/2 1/4. Press 1/2/3. He drove a car for 1/2hour.")

current_result:

"This is a half 1/4. Press 1/2/3. He drove a car for 1/2hour."

Ожидаемый_результат:

"This is a half quarter. Press 1/2/3. He drove a car for half hour."

Понятно, что для обработки необходимо использовать регулярное выражение такие случаи, как 1/2/3 или 1/4. или 1/2hour.

Но этот [0-9]\/[1-9]{1,2} соответствует всему. Что будет правильным регулярным выражением для обработки этих случаев.

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

1 Ответ

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

Вы можете использовать следующие return в своем методе:

return re.sub(r'(?<!\d)(?<!\d/)[0-9]/[0-9]{1,2}(?!/?\d)', lambda x: fraction_dict.get(x.group(), x.group()), text)

См. Python демо . Обратите внимание, что пробел между half и hour отсутствует, поскольку он отсутствовал во входных данных. Вам нужно было бы добавить еще логи c, чтобы добавить пробел только в ожидаемых случаях.

Подробности

  • (?<!\d)(?<!\d/) - ди git или ди git и / не допускаются сразу слева
  • [0-9]/[0-9]{1,2} - ди git, / и 1 или 2 цифры
  • (?!/?\d) - сразу направо, не должно быть / + ди git или просто ди git.

Фрагмент полного кода :

import re
my_str = "This is a 1/2 1/4. Press 1/2/3. He drove a car for 1/2hour." # A free text

def replace_fractions(text):
    fraction_dict = {
        '1/2': 'half',
        '1/4': 'quarter',
        '3/4': 'three quarters',
        '2/3': 'two thirds',
    }
    return re.sub(r'(?<!\d)(?<!\d/)[0-9]/[0-9]{1,2}(?!/?\d)', lambda x: fraction_dict.get(x.group(), x.group()), text)

current_result = replace_fractions("This is a 1/2 1/4. Press 1/2/3. He drove a car for 1/2hour.")
print(current_result)
# => This is a half quarter. Press 1/2/3. He drove a car for halfhour.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...