diff --git a/renderer/unit.py b/renderer/unit.py index 4a6b9f0..86f6c9e 100644 --- a/renderer/unit.py +++ b/renderer/unit.py @@ -35,13 +35,15 @@ class Unit(SpanToken): prefixes = ["p", "n", "μ", "m", "k", "M", "G"] pattern = re.compile( - r"(?P[0-9,]+) ?(?P" + # Check for word boundary at start of value ensures only numeric values are caught. + r"\b(?P[0-9,]+) ?(?P" # Group all prefixes together in a capture group # Empty string at end of list is required so the group always exists in the resulting match + "|".join(prefixes + [""]) + ")(?P" # Group all units together in a capture group. + "|".join(units) + # Word boundary check at end of unit to ensure proper handling of units like A, Ah etc. + r")(?!\w)" ) @@ -50,6 +52,8 @@ class Unit(SpanToken): unit: str def __init__(self, match: re.Match): + print("pattern", self.pattern) + self.value = match.group("value") self.prefix = match.group("prefix") or "" self.unit = match.group("unit") diff --git a/test/test_unit.py b/test/test_unit.py index eb736cd..763aa18 100644 --- a/test/test_unit.py +++ b/test/test_unit.py @@ -15,6 +15,9 @@ def test_basic_units_html(): "0,75 kW": "0,75 kW", "33 A": "33 A", "1 Ah": "1 Ah", # Ah can be a tricky case if the RegEx is wrong, as A might match before Ah, thus rendering the output with an "A" unit + "10 A/mm²": "10 A/mm²", + "DL9MJ": "DL9MJ", # Ensure other strings, like callsings, aren‘t mistaken for units. ;) + "Ein Satz mit 200 V.": "Ein Satz mit 200 V.", # Support units before sentence ends. } for input, output in assertions.items(): @@ -38,6 +41,7 @@ def test_special_units_html(): """Test special units: Don't put space before ° and %.""" assertions = { "100%": "100%", + "100 %": "100%", "42,24°": "42,24°", }