Trädvy Permalänk
Medlem
Registrerad
Jun 2005

Ersätta re.findall

Hej,

Behöver lite hjälp då jag fastnat något, försöker ersätta nummer som jag dividerat, hur ersätter jag resultatet i "find_1" med "find_2" och sparar det i filen Font.xml?

f = xbmcvfs.File(os.path.join(self.kodiPath, file2, 'Font.xml'), 'wb') lines = f.read() line = str(lines) find_1 = [int(s) / float(1.5) for s in re.findall(r'<size>(.*)</size>', line)] find_2 = re.findall(r'<size>(.*)</size>', line)

Tacksam för all hjälp.

Intel Core i7-8700K | ASUS STRIX Z370-F | Corsair Vengeance LED 16GB | ASUS STRIX 1080 Ti OC | Corsair H80i | Corsair Q400 | Corsair AX1200W | Corsair Strafe RGB | Corsair M65 RGB PRO | Corsair VOID RGB PRO
https://github.com/M89SE/script.mtvguide

Trädvy Permalänk
Medlem
Plats
Skövde
Registrerad
Jul 2003

Har lite halvsvårt att förstå vad du är ute efter. Är jag rätt ute om jag antar att du vill ersätta storleken i <size>-taggarna med <storlek>/1,5?

Jag har aldrig använt den modul som du använder i detta fallet så jag kan egentligen inte hjälpa särskilt mycket men några idéer kanske du får. Jag använder f-strings i dessa exempel och det kräver Python 3.6+.

Pythons standardbibliotek är tyvärr inte särskilt bra på att editera filer in-place (så vitt jag vet). Den vanligaste lösningen är nog att iterera källan och skriva till en annan fil. Något åt det här hållet:

import re with open('input.xml', 'r') as f: with open('output.xml', 'w')as of: for line in f: of.write(re.sub(r'<size>(.*)</size>', lambda x: f'<size>{float(x.group(1)) / 1.5}</size>', line))

Jag har ingen som helst koll på Kodis Virtuella Filsystem (som detta verkar vara?) och den pythonmodul du använder, men om write-mode på en fil raderar innehållet på samma sätt som Pythons open() så skulle du kunna iterarera den nya filen och helt enkelt skriva samma innehåll till originalfilen och på så sätt typ uppnå samma resultat som en editering in-place.

Om det strikt måste vara in-place så finns det en modul som heter just in_place du kan använda. Den finns dock inte i standardbiblioteket utan den får du installera själv. Om du har pip installerat (gör det annars) så gör du det enkelt med "pip3 install in_place".

import in_place import re with in_place.InPlace('input.xml') as f: for line in f: line = re.sub(r'<size>(.*)</size>', lambda x: f'<size>{float(x.group(1)) / 1.5}</size>', line) f.write(line)

Hur detta lirar med pythonmodulen i fråga och Kodi's VFS har jag dock som sagt ingen som helst aning om. Lycka till hursomhelst.

Trädvy Permalänk
Medlem
Plats
Zion
Registrerad
Apr 2004
Skrivet av M89:

Hej,

Behöver lite hjälp då jag fastnat något, försöker ersätta nummer som jag dividerat, hur ersätter jag resultatet i "find_1" med "find_2" och sparar det i filen Font.xml?

f = xbmcvfs.File(os.path.join(self.kodiPath, file2, 'Font.xml'), 'wb') lines = f.read() line = str(lines) find_1 = [int(s) / float(1.5) for s in re.findall(r'<size>(.*)</size>', line)] find_2 = re.findall(r'<size>(.*)</size>', line)

Tacksam för all hjälp.

Kolla på hur regex och re är implementerad, re har inbyggda funktioner för att ersätta m.m.

[ i5-6600K @ 4.7Ghz || Corsair H110 GTX || 16GB DDR4 || ASUS Z170 Pro Gaming || Asus ROG 1080 Strix @ 2100+/11Ghz+ ]

"One is always considered mad, when one discovers something that others cannot grasp."
- Ed Wood

Trädvy Permalänk
Medlem
Registrerad
Jun 2005

Så här ser min lösning ut för dem som är intresserade.

f = xbmcvfs.File(os.path.join(self.kodiPath, file2, 'Font.xml'), 'r') l = f.read() n = re.sub(r"(?s)(?<=<size>)\d+(?=</size>)", lambda m: str(int(m.group(0)) / 1.5), l) f2 = xbmcvfs.File(os.path.join(self.kodiPath, file2, 'Font.xml'), 'w') f2.write(n) f2.close()

Tack för för all hjälp.

Intel Core i7-8700K | ASUS STRIX Z370-F | Corsair Vengeance LED 16GB | ASUS STRIX 1080 Ti OC | Corsair H80i | Corsair Q400 | Corsair AX1200W | Corsair Strafe RGB | Corsair M65 RGB PRO | Corsair VOID RGB PRO
https://github.com/M89SE/script.mtvguide