update
This commit is contained in:
@@ -65,6 +65,18 @@ def _locker_mit_map(text: str) -> tuple[str, list[int]]:
|
||||
return "".join(out), mapping
|
||||
|
||||
|
||||
def _casefold_mit_map(text: str) -> tuple[str, list[int]]:
|
||||
"""Gefaltete Kopie + Map auf die Original-Positionen. casefold() kann ein
|
||||
Zeichen zu mehreren expandieren (ß→ss) — die Map hält den Rückweg eindeutig."""
|
||||
out: list[str] = []
|
||||
mapping: list[int] = []
|
||||
for i, c in enumerate(text):
|
||||
for cn in c.casefold():
|
||||
out.append(cn)
|
||||
mapping.append(i)
|
||||
return "".join(out), mapping
|
||||
|
||||
|
||||
_LOCKER_MIN_ZEICHEN = 20 # kürzere Zitate sind alnum-gefaltet nicht mehr eindeutig
|
||||
|
||||
|
||||
@@ -81,11 +93,17 @@ def finde_zitat(text: str, zitat: str) -> tuple[int, int] | None:
|
||||
haystack, mapping = _normiert_mit_map(text)
|
||||
needle = _WS.sub(" ", zitat).strip()
|
||||
pos = haystack.find(needle)
|
||||
if pos < 0:
|
||||
pos = haystack.casefold().find(needle.casefold())
|
||||
if pos >= 0:
|
||||
start = mapping[pos]
|
||||
ende = mapping[min(pos + len(needle) - 1, len(mapping) - 1)] + 1
|
||||
return mapping[pos], mapping[min(pos + len(needle) - 1, len(mapping) - 1)] + 1
|
||||
# Stufe 2: casefold — eigene Map, weil casefold die Länge ändert (ß→ss, fi→fi).
|
||||
# Direkt in `mapping` zu indizieren verschob den Span um jede Expansion vor dem
|
||||
# Treffer und lief am Textende in einen IndexError.
|
||||
hay_cf, sub = _casefold_mit_map(haystack)
|
||||
ndl_cf = needle.casefold()
|
||||
pos = hay_cf.find(ndl_cf)
|
||||
if pos >= 0:
|
||||
start = mapping[sub[pos]]
|
||||
ende = mapping[sub[min(pos + len(ndl_cf) - 1, len(sub) - 1)]] + 1
|
||||
return start, ende
|
||||
hay_l, map_l = _locker_mit_map(text)
|
||||
ndl_l, _ = _locker_mit_map(zitat)
|
||||
|
||||
Reference in New Issue
Block a user