import re
regex = re.compile(r"(?P<amount>-?\d+(?:\.\d*)?)[^\S\n]*(?P<degrees>°|deg(?:rees?)?|in)?[^\S\n]*(?P<unit>c(?:(?=el[cs]ius\b|entigrades?\b|\b))|f(?:(?=ahrenheit\b|\b))|k(?:(?=elvins?\b|\b)))", flags=re.IGNORECASE)
test_str = ("70 degrees celsius\n"
"70 degree fahrenheit\n"
"70 degrees c\n"
"70 degrees f\n"
"70 ° f\n"
"70 ° c\n"
"70°c\n"
"70°f\n"
"70 deg celsius\n"
"70 deg centigrade\n"
"70 deg fahrenheit\n"
"-30.5 in Kelvin\n"
"-30.5 degrees Kelvin\n"
"-30.5 Kelvin\n"
"70F\n"
"70C\n"
"70 c\n"
"70 f\n"
"70k\n"
"100 deg celcius\n\n"
"Oh, it seems I have an oven from Europe. If the recipe calls for 325 degrees fahrenheit and water boils at 100 centigrades, then... multiply, and... voila! Set your oven for 650 degrees celsius--that should make your cookies crispy-brown!\n\n"
"# Failures\n\n"
"70 degrees # too ambiguous\n"
"70 deg felsius # ensure we don't mix fahrenheit and celsius\n\n")
matches = regex.finditer(test_str)
for match_num, match in enumerate(matches, start=1):
print(f"Match {match_num} was found at {match.start()}-{match.end()}: {match.group()}")
for group_num, group in enumerate(match.groups(), start=1):
print(f"Group {group_num} found at {match.start(group_num)}-{match.end(group_num)}: {group}")
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Python, please visit: https://docs.python.org/3/library/re.html