Le domaine qui peut être matché par le point (.) est très grand y compris le caractère /, donc .{1,18}, .{1,5} et .{1,8}, par exemple, qui sont 'greedy', peuvent déranger tous les matches après ... On peut stopper la 'greediness' en ajoutant un point d'interrogation juste après, mais on peut faire autrement aussi (voir plus bas).
Le minimum qu'on peut faire pour sauver le pattern est comme ça. (On peut toujours l'améliorer après et à partir de ça.)
1 2
| #loc = loc + re.findall(r"XYZ[ ]{0,1}=[ ]{0,1}[^/]{1,18}/[^/]{1,8}/[^/]{1,5}", line)
loc = loc + re.findall(r"XYZ\s?=\s?[^/]+/[^/]+/[^\s]+", line) |
Et puis, on peut éviter de faire ce genre de chose par améliorer le pattern
pos = re.sub(r'[a-zA-Z=,;:)( ]', '', pos)
. Cette manipulation semble assez terrible juste pour éliminer XYZ.
Et puis, faisant [0:8] ne semble pas bien suffisant pour bien des cas, mais c'est facile à corriger.
Partager