[New-bugs-announce] [issue17663] re.sub not replacing all

z06steve report at bugs.python.org
Mon Apr 8 15:25:17 CEST 2013


New submission from z06steve:

fails to replace last occurrence of string v_wofstgvw, reproduced in 3.2.3, 3.2.4 and 3.3.1

a='''
--------------------------------------------------------------------------------
-- V_INT_CTRC_ENTRY_DATE
--------------------------------------------------------------------------------
REPLACE VIEW V_WOFSTGVW.V_INT_CTRC_ENTRY_DATE AS LOCKING ROW FOR ACCESS
SELECT                                                                        
 D.DY DY,                   
 D.DW_CRRT_FL CURRENT_FLAG,                                                   
         D.MTH CURRENT_MTH,                                                     
(CAST(D.DY AS DATE) - EXTRACT(DAY FROM (CAST( D.DY AS DATE)))+1)  CURRENT_MTH_BEG_DT,                              
       ADD_MONTHS ((CAST(D.DY AS DATE) - EXTRACT(DAY FROM (CAST( D.DY AS DATE)))+1) , 1) - 1 CURRENT_MTH_END_DT,            
        D.WOFC_MTH_END_FLG CURRENT_MTH_END_FLG,                                
         D.WOFC_QTR_END_FLG CURRENT_QTR_END_FL,                                 
         D.YR CURRENT_YEAR,                                                     
             ((D.YR||'01/01')(DATE)) CURRENT_YEAR_BEG_DT ,     
              ((D.YR||'12/31')(DATE)) CURRENT_YEAR_END_DT ,       
         D.WOFC_YR_END_FLG CURRENT_YEAR_END_FL,                                 
 D.HDAY_FLG HOLIDAY_FLG,                                                    
       CAST(ADD_MONTHS (CASE WOFC_MTH_END_FLG
                               WHEN 'Y'
                                  THEN WOFCO_FRST_DY_MTH
                               ELSE WOFCO_BEGIN_MTH_DT
                            END,
                            -1)AS CHAR(7)) PREV_REP_MTH,
         ADD_MONTHS (CASE WOFC_MTH_END_FLG                                      
                        WHEN 'Y'                                                
                           THEN WOFCO_FRST_DY_MTH                               
                        ELSE WOFCO_BEGIN_MTH_DT                                 
                     END,                                                       
-1
                    ) PREV_REP_MTH_BEG_DT,                                      
        ADD_MONTHS (CASE WOFC_MTH_END_FLG                                      
                        WHEN 'Y'                                                
                           THEN D.DY                                            
                        ELSE D.WOFCO_MTH_END_DT                                 
                     END,                                                       
-1
                    ) PREV_REP_MTH_END_DT                                      
         ,
         D.PREV_MTH PRIOR_MTH,                                                  
         PSETM.PRIOR_SET_CURRENT_MTH,                                           
 PSETM.PRIOR_SET_CURRENT_MTH_BGN_DT,                                          
         PSETM.PRIOR_SET_CURRENT_MTH_END_DT,                                    
 PREPSETM.PRIOR_SET_REP_MTH,                                                  
         PREPSETM.PRIOR_SET_REP_MTH_BGN_DT,                                     
 PREPSETM.PRIOR_SET_REP_MTH_END_DT,                                           
         CASE WOFC_MTH_END_FLG                                                  
            WHEN 'Y'                                                            
               THEN MTH                                                         
            ELSE PREV_MTH                                                       
         END REP_MTH,                                                           
         CASE WOFC_MTH_END_FLG                                                  
            WHEN 'Y'                                                            
               THEN WOFCO_FRST_DY_MTH                                           
            ELSE WOFCO_BEGIN_MTH_DT                                             
         END REP_MTH_BEG_DT,                                                    
         CASE WOFC_MTH_END_FLG                                                  
            WHEN 'Y'                                                            
               THEN D.DY                                                        
            ELSE D.WOFCO_MTH_END_DT                                             
         END REP_MTH_END_DT,
         CASE WOFC_MTH_END_FLG                                                  
            WHEN 'Y'                                                            
               THEN ADD_MONTHS (D.WOFCO_FRST_DY_MTH,                            
12
                               )                                                
            ELSE ADD_MONTHS (D.WOFCO_BEGIN_MTH_DT, 12)                          
         END REP_MTH_NEXT_YEAR_BEG_DT,                                          
         CASE WOFC_MTH_END_FLG                                                  
            WHEN 'Y'                                                            
               THEN ADD_MONTHS (D.DY, 12)                                       
            ELSE D.WOFCO_MTH_NXT_YR_DT                                          
         END REP_MTH_NEXT_YEAR_END_DT,                                          
         CASE WOFC_MTH_END_FLG                                                  
            WHEN 'Y'                                                            
               THEN D.YR                                                        
            ELSE SUBSTR (PREV_MTH, 1, 4)                                        
         END REP_YEAR,                                                    
         CASE WOFC_MTH_END_FLG                                                  
            WHEN 'Y'                                                            
            THEN  (CAST((CAST(D.YR AS DATE FORMAT 'YYYY')||'/01/01') AS DATE FORMAT 'YYYY/MM/DD'))
  ELSE  (CAST((SUBSTR (PREV_MTH, 1, 4) || '/01/01')AS DATE FORMAT 'YYYY/MM/DD' ))
         END REP_YEAR_BEG_DT,                                                   
    CASE WOFC_MTH_END_FLG                                                  
            WHEN 'Y'                                                            
               THEN (CAST((CAST(D.YR AS DATE FORMAT 'YYYY' )||'/12/31') AS DATE FORMAT 'YYYY/MM/DD'))              
            ELSE (CAST((SUBSTR (PREV_MTH, 1, 4) || '/12/31') AS DATE FORMAT 'YYYY/MM/DD' ))   
         END REP_YEAR_END_DT,
 D.SET_MTH SET_CURRENT_MTH,                                                   
         D.SET_BEGIN_MTH_DT SET_CURRENT_MTH_BGN_DT,                             
         D.SET_MTH_END_DT SET_CURRENT_MTH_END_DT,                               
 D.SET_YR SET_CURRENT_YEAR,                                                   
         D1.SET_CURRENT_BEG_DT SET_CURRENT_YEAR_BEG_DT,                         
         D2.SET_CURRENT_END_DT SET_CURRENT_YEAR_END_DT,                         
         D.SET_MTH_END_FLG SET_MTH_END_FLAG,                                    
         D.SET_QTR_END_FLG SET_QTR_END_FLAG,                                    
         CASE D.SET_MTH_END_FLG                                                 
            WHEN 'Y'                                                            
               THEN (CAST (D.SET_BEGIN_MTH_DT AS CHAR(7)))                  
            ELSE (CAST (SET_MTH_BEG_PREV_DT AS CHAR (7)))                 
         END SET_REP_MTH,                                                       
         CASE D.SET_MTH_END_FLG                                                 
            WHEN 'Y'                                                            
               THEN D.SET_BEGIN_MTH_DT                                          
            ELSE SET_MTH_BEG_PREV_DT                                            
         END SET_REP_MTH_BEG_DT,                                                
         CASE D.SET_MTH_END_FLG                                                 
            WHEN 'Y'                                                            
               THEN D.SET_MTH_END_DT                                            
            ELSE SET_MTH_END_PREV_DT                                            
         END SET_REP_MTH_END_DT,                                                
         SUBSTR (CASE D.SET_MTH_END_FLG                                         
                    WHEN 'Y'                                                    
                       THEN (CAST (D.SET_BEGIN_MTH_DT AS CHAR(7)))              
                    ELSE (CAST (SET_MTH_BEG_PREV_DT AS CHAR(7)))               
                 END,                                                           
                 1, 4)SET_REP_YEAR ,                                                      
         RD1.SET_RPT_YEAR_BEG_DT SET_RPT_YEAR_BEG_DT,                           
 SYB.SET_RPT_YEAR_END_DT,                                                     
D.SET_YR_END_FLG SET_YEAR_END_FLAG                                                                      
 FROM  V_WOFSTGVW.D_DT D
LEFT OUTER JOIN 
          (SELECT   D.SET_YR,                                      
                   MIN (D.SET_BEGIN_YR_DT) SET_CURRENT_BEG_DT      
              FROM V_WOFSTGVW.D_DT D                                          
             WHERE (CAST (D.SET_BEGIN_YR_DT AS CHAR(4)))  =           
                                                         D.SET_YR  
           GROUP BY D.SET_YR) D1                            
ON
  D1.SET_YR = D.SET_YR                                               
LEFT OUTER JOIN 
         (SELECT D_SET_CURR_END.SET_YR, D_SET_CURR_END.DY SET_CURRENT_END_DT    
            FROM V_WOFSTGVW.D_DT D_SET_CURR_END                                            
           WHERE D_SET_CURR_END.SET_YR_END_FLG = 'Y') D2                 
           ON D2.SET_YR = D.SET_YR 
LEFT OUTER JOIN 
         (SELECT   CASE WOFC_MTH_END_FLG                                        
                      WHEN 'Y'                                                  
                         THEN D.YR                                 
                      ELSE SUBSTR (D.PREV_MTH, 1, 4)               
                   END SET_RPT_YR,                                              
                   MIN (D.SET_BEGIN_YR_DT) SET_RPT_YEAR_BEG_DT     
              FROM V_WOFSTGVW.D_DT D                                          
             WHERE D.PREV_MTH IS NOT NULL                          
               AND SET_BEGIN_YR_DT IS NOT NULL                                  
          GROUP BY CASE WOFC_MTH_END_FLG                                        
                      WHEN 'Y'                                                  
                         THEN D.YR                                 
                      ELSE SUBSTR (D.PREV_MTH, 1, 4)               
                   END) RD1                                         
    ON RD1.SET_RPT_YR =                                                   
            (CASE D.SET_MTH_END_FLG                                             
                WHEN 'Y'                                                        
                   THEN (CAST(D.SET_BEGIN_MTH_DT AS CHAR(4)))                   
                ELSE (CAST (D.SET_MTH_BEG_PREV_DT AS CHAR(4)))                    
             END                                                                
            )                                                                   
LEFT OUTER JOIN 
         (SELECT   D.SET_MTH, MIN (D.SET_MTH_END_DT) SET_RPT_YEAR_END_DT        
              FROM V_WOFSTGVW.D_DT D                                                       
             WHERE D.SET_MTH =                                                  
                      CASE D.SET_MTH_END_FLG                                    
                         WHEN 'Y'                                               
                            THEN (CAST(D.SET_BEGIN_MTH_DT AS CHAR(4)))       
                         ELSE (CAST (SET_MTH_BEG_PREV_DT AS CHAR(4)))          
                      END                                                       
          GROUP BY D.SET_MTH) SYB                                            
ON
 (   SYB.SET_MTH  =                                                      
               CASE WOFC_MTH_END_FLG                                            
                  WHEN 'Y'                                                      
                     THEN D.YR                                                  
                  ELSE SUBSTR (D.PREV_MTH, 1, 4)                                
               END                                                              
            || '/12' )                                                   
LEFT OUTER JOIN 
         (SELECT DISTINCT D.SET_MTH_END_FLG SET_MTH_END_FLAG,                   
                          D.SET_MTH PRIOR_SET_CURRENT_MTH,                      
                          D.SET_BEGIN_MTH_DT PRIOR_SET_CURRENT_MTH_BGN_DT,      
                          D.SET_MTH_END_DT PRIOR_SET_CURRENT_MTH_END_DT         
                     FROM V_WOFSTGVW.D_DT D) PSETM                                  
ON 
       PSETM.PRIOR_SET_CURRENT_MTH =                                 
                       (CAST (ADD_MONTHS (D.SET_BEGIN_MTH_DT, -1) AS CHAR(7)))            
AND  PSETM.SET_MTH_END_FLAG = D.SET_MTH_END_FLG 
LEFT OUTER JOIN 
         (SELECT DISTINCT D.SET_MTH_END_FLG SET_MTH_END_FLAG,                   
                          D.SET_MTH PRIOR_SET_REP_MTH,                          
                          D.SET_BEGIN_MTH_DT PRIOR_SET_REP_MTH_BGN_DT,          
                          D.SET_MTH_END_DT PRIOR_SET_REP_MTH_END_DT             
                     FROM V_WOFSTGVW.D_DT D) PREPSETM                                      
ON
       PREPSETM.PRIOR_SET_REP_MTH  =                                  
                 (CAST (ADD_MONTHS (CASE D.SET_MTH_END_FLG                    
                                         WHEN 'Y'                               
                                            THEN D.SET_BEGIN_MTH_DT             
                                         ELSE SET_MTH_BEG_PREV_DT               
                                      END, -1 ) AS CHAR(7)) )                               
AND  PREPSETM.SET_MTH_END_FLAG = D.SET_MTH_END_FLG
WHERE V_WOFSTGVW.D.DY <> DATE '9999-12-31';'''

re.sub('v_wofstgvw','d_dscteve', a, re.MULTILINE, re.IGNORECASE)

----------
components: Regular Expressions
messages: 186300
nosy: ezio.melotti, mrabarnett, z06steve
priority: normal
severity: normal
status: open
title: re.sub not replacing all
versions: Python 3.2, Python 3.3

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue17663>
_______________________________________


More information about the New-bugs-announce mailing list