2009-11-26 9 views
0

Ok donc j'ai ce morceau de code:Python expression régulière correspondant à un bloc multiligne de texte, mais sans le remplacer

def findNReplaceRegExp(file_name, regexp, replaceString, verbose=True, confirmationNeeded=True): 
'''Replaces the oldString with the replaceString in the file given,\ 
    returns the number of replaces 
''' 
    # initialize local variables 
    cregexp = re.compile(regexp, re.MULTILINE | re.DOTALL) 
    somethingReplaced = True 
    ocurrences = 0 
    isAborted = False 

    # open file for read 
    file_in = open(file_name, 'r') 
    file_in_string = file_in.read() 
    file_in.close() 

    while somethingReplaced: 
     somethingReplaced = False 
     # if the regexp is found 
     if cregexp.search(file_in_string): 
      # make the substitution 
      replaced_text = re.sub(regexp, replaceString, file_in_string) 
      if verbose == True: 
       # calculate the segment of text in which the resolution will be done 

       # print the old string and the new string 
       print '- ' + file_in_string 
       print '+ ' + replaced_text 
       if confirmationNeeded: 
        # ask user if this should be done 
        question = raw_input('Accept changes? [Yes (Y), No (n), Abort (a)] ') 
        question = string.lower(question) 
        if question == 'a': 
         isAborted = True 
         print "Aborted" 
         break 
        elif question == 'n': 
         pass 
        else: 
         file_in_string = replaced_text 
         somethingReplaced = True 
         ocurrences = ocurrences + 1 
      else: 
       file_in_string = replaced_text 
       somethingReplaced = True 
       ocurrences = ocurrences + 1 

    # if some text was replaced, overwrite the original file 
    if ocurrences > 0 and not isAborted: 
     # open the file for overwritting 
     file_out = open(file_name, 'w') 
     file_out.write(file_in_string) 
     file_out.close() 
     if verbose: print "File " + file_name + " written" 

Ce fichier

CMC_SRS T10-24400: DKU Data Supply: SN Time Break-In Area 
CMC_SRS T10-24401: DKU Data Supply: SN Transponder Enable Area 
CMC_SRS T10-24402: DKU Data Supply: SN Adjust Master Slave Area 
CMC_SRS T10-24403: DKU Data Supply: SN ATEC Area 
CMC_SRS T10-24404: DKU Data Supply: SN PTEC Area 
CMC_SRS T10-25449: DKU Data Supply: SN Self Init Area 
CMC_SRS T10-24545: DKU Data Supply: SN Time Area 
CMC_SRS T10-4017: RFI display update 
CMC_SRS T10-6711: Radio Interface to PLS Equipment 
CMC_SRS T10-21077: Safety Requirements: Limit FM Power 

Quand j'appelle la procédure avec ce fichier et ces paramètres: regexp = 24403. * 24404 replace = TESTSTRING

je reçois une coïncidence (il correspond et se demande quoi faire) mais wh En son temps de remplacer rien ne se passe ... Qu'est-ce qui ne va pas ??

Répondre

1

Vous trouvez avec cregexp, qui a l'ensemble d'options multiligne, mais en remplaçant par regexp, qui peut ou non.

+0

Et vous pouvez simplement remplacer 'regexp' par' cregexp' car re.sub accepte une chaîne ainsi qu'un objet regex comme premier paramètre. –