2017-07-08 2 views
0

Unten ist mein Code ersetzen -Versuch Strings aus einer riesigen Datei zu finden und das Ergebnis mit einem anderen String

import tarfile 
import os 
import sys 
import re 

script, bak = sys.argv 
bakfile = str(bak) 
currentwd = os.path.dirname(os.path.realpath(__file__)) 
file_to_work = tarfile.open(name=currentwd+"/"+bakfile, mode="r") 
file_to_work.extractall() 

currentwd = os.path.dirname(os.path.realpath(__file__)) 
with open(currentwd+"/onedb.xml", "r") as file: 
    f = file.read() 
    words = re.findall(r'{ssha}_\w*?=', f) 
    re.sub(words,r'string_to_replace',f) 

I verwendet tarfile Modul und ein gzfile extrahierte, aus den extrahierten Dateien, nahm onedb.xml. Benutzte Regex, um die Zeichenfolgen zu finden, und das war erfolgreich.

Jetzt, wenn ich versuche, gesuchte Zeichenfolgen mit re.sub zu ersetzen, erhalte ich den folgenden Fehler.

Traceback (most recent call last): 
    File "preset.py", line 16, in <module> 
    re.sub(words,r'string_to_replace',f) 
    File "/usr/lib/python2.7/re.py", line 151, in sub 
    return _compile(pattern, flags).sub(repl, string, count) 
    File "/usr/lib/python2.7/re.py", line 232, in _compile 
    p = _cache.get(cachekey) 
TypeError: unhashable type: 'list' 
+0

'words = re.findall (r '{SSHA} _ \ w * =?', F)' 'gibt eine Python list'. Sie übergeben diese "Liste" an die Funktion "re" als Muster. Das führt zwangsläufig zu Fehlern. – Abdou

+0

@Abdou, dank dir. Irgendwelche Vorschläge, um das zu beheben? –

+0

Ich bin nicht ganz sicher, was Sie ersetzen möchten, aber wenn Sie versuchen, alle Elemente von 'words' zu ersetzen, dann können Sie versuchen:' re ('|' .join (words), r'string_to_replace ', f) ". – Abdou

Antwort

0

Verwenden alle in einer Expression:

re.sub(r'{ssha}_\w*?=', r'string_to_replace', f) 
+0

Versucht dies. Da die Datei riesig ist, sitzt das Skript einfach und ist nicht sicher, was hinter der Szene vor sich geht. @stovfl –

Verwandte Themen