Строка возврата из регулярного выражения не может быть найден в другой строке с использованием в операторе Python - PullRequest
0 голосов
/ 18 января 2019

Сейчас я изучаю регулярные выражения, и мне трудно отлаживать. Моя цель состоит в том, чтобы, учитывая строку, которая содержит несколько соотношений или форматов одинаковых форматов, извлеките все правильные соотношения в формате x +: x + (+ означает несколько цифр). Это мой код ниже:

string= "2890.1:2004 1.45.7 2890.6:2009 505.204:908.890 1:100 0.55:1 10:59:40"

#empty string declaration
other_str = str()
time_str = str()
ratio_str = str()

#pattern for ratio, time and other format
pattern_ratios = re.compile(r'1:[-+]?[0-9]+')
pattern_time = re.compile(r'[0-9]+:[0-9]+:[0-9]+')
pattern_other = re.compile(r'\d*\.?\d+:\d*\.?\d+')

#create irritable re.match object
matches_ratios = pattern_ratios.finditer(string)
matches_time = pattern_time.finditer(string)
matches_other = pattern_other.finditer(string)

#create a time string to store all time format found
for time_match in matches_time:
    time_str += string[time_match.span()[0]:time_match.span()[1]] + ' '
print('time string =',time_str)

#create a other string to store all other format found
for other_match in matches_other:
    other_str += string[other_match.span()[0]:other_match.span()[1]] + ' '
print('other string =', other_str)

#create a ratio string to store all ratio format found
for ratio_match in matches_ratios:
    ratio = string[ratio_match.span()[0]:ratio_match.span()[1]]
    print('\nratio =',ratio)
    print('not in other string:',ratio not in other_str)
    print('not in time string:',ratio not in time_str)
    if (ratio not in other_str and ratio not in time_str):
        ratio_str += ratio + ' '

print('ratio list =',ratio_str.split())

Вывод:

строка времени = 10: 59: 40
другая строка = 2890,1: 2004 2890,6: 2009 505,204: 908,890 1: 100 0,55: 1 10:59

Соотношение = 1: 2004
не в другой строке: False

не во временной строке: True

Соотношение = 1: 100
не в другой строке: False

не во временной строке: True

список коэффициентов = []

Что является неожиданным выводом, потому что, насколько я понимаю, если я сделаю это в двух разных строках, как показано ниже:

str1 = '2890.1:2004 2890.6:2009 505.204:908.890 1:100 0.55:1 10:59'
str2 = '1:2004'
str2 in str1

Вывод True! Это как-то связано с самим оператором?

1 Ответ

0 голосов
/ 18 января 2019

Проблема в том, что вы используете and там, где вы должны использовать or:

if (ratio not in other_str or ratio not in time_str):
        ratio_str += ratio + ' '

Это должно дать вам результат:

ratio list = ['1:2004', '1:100']
...