2009-10-26 7 views
0

Débutant à Python .... demandé de l'aide à la tâche suivante :-)Python - RegExp - Modifier les fichiers texte

Je arbre de divers dossiers, certains d'entre eux sont le code source C. Je voudrais modifier ces fichiers C avec un script python.

Le code C a 4 - définit

#define ZR_LOG0(Id, Class, Seveity, Format) 
#define ZR_LOG1(Id, Class, Seveity, Format, Attr0) 
#define ZR_LOG2(Id, Class, Seveity, Format, Attr0, Attr1) 
#define ZR_LOG3(Id, Class, Seveity, Format, Attr0, Attr1, Attr2) 

Il existe différentes lignes ZR_LOGn répartis dans tout le code source C.

Exemple: ZR_LOG1 (1, LOG_CLASS_3, LOG_INFO, "hello world% d", 76);

Des espaces blancs (espaces, tabulations) peuvent apparaître n'importe où sur la ligne (entre les champs).

La tâche de script Python est comme suit:

  1. Remplacer tout champ « id » (qui est un type entier que nous ne se soucient pas de sa valeur d'origine) avec compteur séquentiel. (La première ligne 'LOG' ... nous rencontrerons le champ 'Id' obtiendra la valeur 0, la suivante 1, et ainsi de suite)
  2. Dans un fichier de sortie séparé, pour chaque ligne ZR_LOG, nous « ll créer une ligne d'index dans le format {newID, Format}, Pour l'exemple ci-dessus obtiendrez:

    { 0, "hello world %d" }, 
    

apprécie votre aide avec elle ....


J'ai commencé avec le code suivant, vous pouvez le regarder ou l'ignorer complètement.

''' 
Created on Oct 25, 2009 

@author: Uri Shkolnik 

The following version does find & replace LOG Ids for all 
C source files in a dir (and below) with sequential counter, 
The files are assumed to be UTF-8 encoded. 
(which works fine if they are ASCII, because ASCII is a 
subset of UTF-8) 
It also assemble new index file, composed from all new IDs and format fields 

''' 

import os, sys, re, shutil 

mydir= '/home/uri/proj1' 
searched_pattern0 = 'ZR_LOG0' 

def search_and_replace(filepath): 
    ''' replaces all string by a regex substitution ''' 
    backupName=filepath+'~re~' 

    print 'reading:', filepath 
    input = open(filepath,'rb') 
    s=unicode(input.read(),'utf-8') 
    input.close() 

    m = re.match(ur'''[:space:]ZR_LOG[0-3].*\(.*[0-9]{0,10},LOG_''', s) 
    print m 

def c_files_search(dummy, dirr, filess): 
    ''' search directories for file pattern *.c ''' 
    for child in filess: 
     if '.c' == os.path.splitext(child)[1] and os.path.isfile(dirr+'/'+child): 
      filepath = dirr+'/'+child 
      search_and_replace(filepath) 

os.path.walk(mydir, c_files_search, 3) 

Répondre

1

Quelques points:

  • Vous pouvez faire correspondre les espaces avec '\' s.
  • Les groupes de capture d'expression rationnelle sont utiles ici.

Alors, je ferais quelque chose comme ceci:

output = '' 
counter = 1 
for line in lines: 
    # Match only ZR_LOG lines and capture everything surrounding "Id" 
    match = re.match('^(.*\sZR_LOG[0-3]\s*\(\s*)' # group(1), before Id 
        'Id' 
        '(,.*)$', # group(2), after Id 
        line) 
    if match: 
     # Add everything before Id, the counter value and everything after Id 
     output += match.group(1) + str(counter) + match.group(2) 
     counter += 1 
     # And do extra logging etc. 
    else: 
     output += line 
+0

merci :-) a été très utile – Uri