Почему, если оператор elif выполняется дважды?

#python

Вопрос:

Это мой код, очень простой, просто используйте регулярное выражение, чтобы найти в строке и изменить элемент списка:

 header=['premium','ri pre','ri prepaid']
import re

for i in range(len(header)):
    j=0
    print(i)
    print(header[i])
    if re.search('.*policy.*no.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='POLICY NO'
        print(1)
        print(header[i])
        j=j 1
    elif re.search('.*endor.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='ENDORSEMENT NO'
        print(2)
        print(header[i])
        j=j 1
    elif  re.search('.*customer.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='CUSTOMER NAME'
        print(3)
        print(header[i])
        j=j 1
    elif  re.search('.*inception.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='INCEPTION DATE'
        print(4)
        print(header[i])
        j=j 1
    elif  re.search('.*maturity.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='MATURITY DATE'
        print(5)
        print(header[i])
        j=j 1
    elif  re.search('.*currency.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='CURRENCY CODE'
        print(6)
        print(header[i])
        j=j 1
    elif  re.search('.*sum.*insured.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='SUM INSURED'
        print(7)
        print(header[i])
        j=j 1
    elif  re.search('.*ri.*net.*pre.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='RI NET PREMIUM'
        print(8)
        print(header[i])
        j=j 1
    elif  re.search('.*net.*pre.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='NET PREMIUM'
        print(9)
        print(header[i])
        j=j 1
    elif  re.search('.*ri.*share.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='RI SHARE'
        print(10) 
        print(header[i])
        j=j 1
    elif  re.search('.*ri.*pre.*paid.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='RI PREPAID'
        print(11)  
        print(header[i])
        j=j 1
    elif  re.search('.*ri.*pre.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='RI PREMIUM'
        print(12)
        print(header[i])
        j=j 1
    if re.search('.*balance.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='BALANCE'  
        print(13)
        print(header[i])
        j=j 1
    elif  re.search('.*ri.*com.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='RI COMM'
        print(14)
        print(header[i])
        j=j 1
    elif  re.search('.*ri.*tax.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='RI TAX'
        print(15)
        print(header[i])
        j=j 1
    elif  re.search('.*uw.*year.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='UW YEAR'
        print(16)  
        print(header[i])
        j=j 1
    elif  re.search('premium.*',header[i],flags=re.IGNORECASE) is not None : #and re.search('.*ri.*',header[i],flags=re.IGNORECASE) is None
        header[i]='NET PREMIUM'
        print(17)
        print(header[i])
        j=j 1
    print ('run times:' str(j))
 

Это результат моего кода, когда итератор выполняет итерацию до второго элемента, оператор if выполняется два раза:

 0
premium
17
NET PREMIUM
run times:1
1
ri pre
12
RI PREMIUM
17
NET PREMIUM
run times:2
2
ri prepaid
11
RI PREPAID
run times:0
 

Я не понимаю, почему он запускается дважды на этапах 12 и 17 elif???
Elif не должен проверять, выполняется ли уже одно условие.
Спасибо!!!

Комментарии:

1. Похоже, что поисковые запросы № 11 и №16 отсутствуют j=j 1 .

2. У вас есть if в середине кода, который, вероятно, должен быть elif . (Для «БАЛАНСА»)

Ответ №1:

Причина такого поведения if в том, что в вашем коде есть 2 s.

  1. if re.search('.*policy.*no.*',header[i],flags=re.IGNORECASE) is not None:
  2. if re.search('.*balance.*',header[i],flags=re.IGNORECASE) is not None:

Поэтому при ri pre повторении он соответствует условию elif re.search('.*ri.*pre.*',header[i],flags=re.IGNORECASE) is not None: , и вы обновляете header[i]='RI PREMIUM' , так что теперь это header[i] также соответствует elif re.search('premium.*',header[i],flags=re.IGNORECASE) is not None : второму if блоку, как сейчас header[i] RI PREMIUM .
Ниже приведен код, который, я думаю, вам требуется:

 header=['premium','ri pre','ri prepaid']
import re

for i in range(len(header)):
    j=0
    print(i)
    print(header[i])
    if re.search('.*policy.*no.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='POLICY NO'
        print(1)
        print(header[i])
        j=j 1
    elif re.search('.*endor.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='ENDORSEMENT NO'
        print(2)
        print(header[i])
        j=j 1
    elif  re.search('.*customer.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='CUSTOMER NAME'
        print(3)
        print(header[i])
        j=j 1
    elif  re.search('.*inception.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='INCEPTION DATE'
        print(4)
        print(header[i])
        j=j 1
    elif  re.search('.*maturity.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='MATURITY DATE'
        print(5)
        print(header[i])
        j=j 1
    elif  re.search('.*currency.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='CURRENCY CODE'
        print(6)
        print(header[i])
        j=j 1
    elif  re.search('.*sum.*insured.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='SUM INSURED'
        print(7)
        print(header[i])
        j=j 1
    elif  re.search('.*ri.*net.*pre.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='RI NET PREMIUM'
        print(8)
        print(header[i])
        j=j 1
    elif  re.search('.*net.*pre.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='NET PREMIUM'
        print(9)
        print(header[i])
        j=j 1
    elif  re.search('.*ri.*share.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='RI SHARE'
        print(10) 
        print(header[i])
        j=j 1
    elif  re.search('.*ri.*pre.*paid.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='RI PREPAID'
        print(11)  
        print(header[i])
        j=j 1
    elif  re.search('.*ri.*pre.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='RI PREMIUM'
        print(12)
        print(header[i])
        j=j 1
        
    elif re.search('.*balance.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='BALANCE'  
        print(13)
        print(header[i])
        j=j 1
    elif  re.search('.*ri.*com.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='RI COMM'
        print(14)
        print(header[i])
        j=j 1
    elif  re.search('.*ri.*tax.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='RI TAX'
        print(15)
        print(header[i])
        j=j 1
    elif  re.search('.*uw.*year.*',header[i],flags=re.IGNORECASE) is not None:
        header[i]='UW YEAR'
        print(16)  
        print(header[i])
        j=j 1
    elif  re.search('premium.*',header[i],flags=re.IGNORECASE) is not None : #and re.search('.*ri.*',header[i],flags=re.IGNORECASE) is None
        header[i]='NET PREMIUM'
        print(17)
        print(header[i])
        j=j 1
    print ('run times:' str(j))
 

Выход:

 0
premium
17
NET PREMIUM
run times:1
1
ri pre
12
RI PREMIUM
run times:1
2
ri prepaid
11
RI PREPAID
run times:1