[英]Regular expression to extract fractions
我正在寻找一个正则表达式来匹配给定字符串中格式[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/3
或1/4.
或1/2hour
。
但是,这个[0-9]\/[1-9]{1,2}
匹配所有内容。 处理这些情况的正确正则表达式是什么。
注意:正则表达式只需要处理上述情况。 所有极端情况均可忽略(或专家点评后重新编辑)
您可以在您的方法中使用以下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
之间的空格丢失了,因为它在输入中丢失了。 您需要添加更多逻辑以仅在预期情况下添加空间。
细节
(?<?\d)(?<!\d/)
- 一个数字或一个数字和/
不允许紧跟在左边[0-9]/[0-9]{1,2}
- 一个数字, /
和 1 或 2 位数字(??/?\d)
- 紧靠右边,不应该有/
+ 数字或只有一个数字。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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.