提取分数的正则表达式

2024-05-07 18:36:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一个正则表达式来匹配给定字符串中格式[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.")

当前结果:

"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/31/4.1/2hour等情况

但是,这个[0-9]\/[1-9]{1,2}匹配所有内容。处理这些案件的合适正则表达式是什么

注意:正则表达式只需处理上述情况。所有极端情况均可忽略(或在专家评论后重新编辑)


Tags: textforisthiscartmpdictreplace
1条回答
网友
1楼 · 发布于 2024-05-07 18:36:51

您可以在方法中使用以下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 demo。注意halfhour之间的空格丢失了,因为它在输入中丢失了。您需要添加更多的逻辑,以便仅在预期情况下添加空间

详细信息

  • (?<!\d)(?<!\d/)-不允许直接在左侧使用数字或数字和/
  • [0-9]/[0-9]{1,2}-一个数字,/和1或2个数字
  • (?!/?\d)-右边不应该有/+个数字或者只有一个数字

Full code snippet

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.

相关问题 更多 >