#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.
if re.search('.*policy.*no.*',header[i],flags=re.IGNORECASE) is not None:
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