import re
def extract_values( sentence) :
num = r'\d *\. ?\d +(?:/\d *\. ?\d +)*'
matches = re .findall ( fr'(({num})(?:\s +(?:and|to)\s +({num}))*)' , sentence)
result = [ ]
for x, y, z in matches:
if '/' in x:
result.append ( x)
else :
result.extend ( filter ( lambda x: x!= "" , [ y, z] ) )
return result
# ['1 and 1/2', '.5', '5', '9 to 11', '9 to 9 and 1/2', '11/12/20']
print ( extract_values( "He is 1 and 1/2 years old. He is .5 years old and he is 5 years old. He is between 9 to 11 or 9 to 9 and 1/2. He was born 11/12/20" ) )
text = "Score 1 and 2 sometimes, often 1 and 1/2, or 2.5 or 3 and 1/3."
print ( extract_values( text) )
# <1>, <2>, <1 and 1/2>, <2.5>, <3 and 1/3>
aW1wb3J0IHJlCgpkZWYgZXh0cmFjdF92YWx1ZXMoc2VudGVuY2UpOgogICBudW0gPSByJ1xkKlwuP1xkKyg/Oi9cZCpcLj9cZCspKicKICAgbWF0Y2hlcyA9IHJlLmZpbmRhbGwoZnInKCh7bnVtfSkoPzpccysoPzphbmR8dG8pXHMrKHtudW19KSkqKScsIHNlbnRlbmNlKQoKICAgcmVzdWx0ID0gW10KICAgZm9yIHgseSx6IGluIG1hdGNoZXM6CiAgICAgICBpZiAnLycgaW4geDoKICAgICAgICAgICByZXN1bHQuYXBwZW5kKHgpCiAgICAgICBlbHNlOgogICAgICAgICAgIHJlc3VsdC5leHRlbmQoZmlsdGVyKGxhbWJkYSB4OiB4IT0iIiwgW3ksel0pKQogICByZXR1cm4gcmVzdWx0CgojIFsnMSBhbmQgMS8yJywgJy41JywgJzUnLCAnOSB0byAxMScsICc5IHRvIDkgYW5kIDEvMicsICcxMS8xMi8yMCddCnByaW50KGV4dHJhY3RfdmFsdWVzKCJIZSBpcyAxIGFuZCAxLzIgeWVhcnMgb2xkLiBIZSBpcyAuNSB5ZWFycyBvbGQgYW5kIGhlIGlzIDUgeWVhcnMgb2xkLiBIZSBpcyBiZXR3ZWVuIDkgdG8gMTEgb3IgOSB0byA5IGFuZCAxLzIuIEhlIHdhcyBib3JuIDExLzEyLzIwIikpCgp0ZXh0ID0gIlNjb3JlIDEgYW5kIDIgc29tZXRpbWVzLCBvZnRlbiAxIGFuZCAxLzIsIG9yIDIuNSBvciAzIGFuZCAxLzMuIgpwcmludCggZXh0cmFjdF92YWx1ZXModGV4dCkgKQoKIyA8MT4sIDwyPiwgPDEgYW5kIDEvMj4sIDwyLjU+LCA8MyBhbmQgMS8zPg==
stdout
['1 and 1/2', '.5', '5', '9', '11', '9 to 9 and 1/2', '11/12/20']
['1', '2', '1 and 1/2', '2.5', '3 and 1/3']