Как заменить символы в строке, содержащей числа, чтобы получить весь возможный диапазон чисел? ⇐ Python
Как заменить символы в строке, содержащей числа, чтобы получить весь возможный диапазон чисел?
У меня есть некоторые правила для номеров, используемых на VoIP-сервере, например 123?, 20(35-98), 3?6(0-3), 205(3,6,7), 26??, 1( 0-3)7(5,6,7) и так далее.
Я проанализировал эти правила и составил список в своем скрипте Python.
Теперь мне нужно заменить такие символы, как «?», «-», «,» в каждом правиле, чтобы я мог получить все возможные числа из данного правила.
Каждый символ имеет значение, например «?» означает все числа от 0 до 9 (123? -> 1230-1239); '-' означает диапазон от наименьшего числа до наибольшего числа (20(35-98) -> 2035-2098); ',' также дает определенные варианты чисел (205(3,6,7) -> 2053, 2056, 2057).
Как я могу это сделать?
Я попытался разбить строку, а затем выполнить цикл for или while (в зависимости от символа) для каждого числа в скобках, а затем добавить число результата в список. Но код работает только для одного условия, а не если есть, например, '?' и «-» в одном правиле или даже два символа вопросительного знака в одном правиле. Вот код:
rule_numbers = ['790790', '3491', '5110', '790799', '3400', '180(8,9)', '337(0-2)', '34( 00-27)', '3378', '342(1-3,5)', '345(3,6,9)', '3468', '3479', '3499', '3482', '34 ??'] single_rule_numbers = [] для rule_num в rule_numbers: если '?' в правиле_номер: для символа в rule_num: если символ == '?': номер_правила = номер_правила.replace(char, '(0-9)') if len(rule_num) > 5 и rule_num.isdigit(): ## ТОЛЬКО 6-значный single_rule_numbers.append(rule_num) elif '(' в Rule_num и ')' в Rule_num: если '-' и ',' в правиле_номер: maindigits = rule_num.split('(')[0] rangedigits = rule_num.split('(')[1][:-1] для копания в rangedigits.split(','): если '-' в копании: самая низкая_цифра, самая высокая_цифра = dig.split('-') если len(самая низкая_цифра) > 1: индекс = -1 в то время как int(самая низкая_цифра) < int(самая высокая_цифра)+1: digit_str = str(самая низкая_цифра) single_rule_numbers.append(maindigits+str(digit_str)) если int(самая низкая_цифра[индекс]) == 9: индекс -= 1 еще: самая низкая_цифра = самая низкая_цифра[:индекс] + str(int(самая низкая_цифра[индекс:])+1) еще: для копания в диапазоне (int(самая низкая_цифра), int(самая высокая_цифра)+1): single_rule_numbers.append(maindigits+str(dig)) еще: single_rule_numbers.append(основные цифры+копать) elif '-' в номере_правила и ',' не в номере_правила: ## 34(00-35), 34(21-48), 345(0-3) maindigits = rule_num.split('(')[0] rangedigits = rule_num.split('(')[1][:-1] самая низкая_цифра, самая высокая_цифра = диапазон цифр.split('-') если len(самая низкая_цифра) > 1: индекс = -1 в то время как int(самая низкая_цифра) < int(самая высокая_цифра)+1: digit_str = str(самая низкая_цифра) single_rule_numbers.append(maindigits+str(digit_str)) если int(самая низкая_цифра[индекс]) == 9: индекс -= 1 еще: самая низкая_цифра = самая низкая_цифра[:индекс] + str(int(самая низкая_цифра[индекс:])+1) еще: для копания в диапазоне (int(самая низкая_цифра), int(самая высокая_цифра)+1): single_rule_numbers.append(maindigits+str(dig)) elif ',' в правиле_номер и '-' не в правило_номер: ## 345(3,6,8), 34(28,34,53) maindigits = rule_num.split('(')[0] rangedigits = rule_num.split('(')[1][:-1].split(',') для копания в диапазоне цифр: single_rule_numbers.append(основные цифры+копать)
У меня есть некоторые правила для номеров, используемых на VoIP-сервере, например 123?, 20(35-98), 3?6(0-3), 205(3,6,7), 26??, 1( 0-3)7(5,6,7) и так далее.
Я проанализировал эти правила и составил список в своем скрипте Python.
Теперь мне нужно заменить такие символы, как «?», «-», «,» в каждом правиле, чтобы я мог получить все возможные числа из данного правила.
Каждый символ имеет значение, например «?» означает все числа от 0 до 9 (123? -> 1230-1239); '-' означает диапазон от наименьшего числа до наибольшего числа (20(35-98) -> 2035-2098); ',' также дает определенные варианты чисел (205(3,6,7) -> 2053, 2056, 2057).
Как я могу это сделать?
Я попытался разбить строку, а затем выполнить цикл for или while (в зависимости от символа) для каждого числа в скобках, а затем добавить число результата в список. Но код работает только для одного условия, а не если есть, например, '?' и «-» в одном правиле или даже два символа вопросительного знака в одном правиле. Вот код:
rule_numbers = ['790790', '3491', '5110', '790799', '3400', '180(8,9)', '337(0-2)', '34( 00-27)', '3378', '342(1-3,5)', '345(3,6,9)', '3468', '3479', '3499', '3482', '34 ??'] single_rule_numbers = [] для rule_num в rule_numbers: если '?' в правиле_номер: для символа в rule_num: если символ == '?': номер_правила = номер_правила.replace(char, '(0-9)') if len(rule_num) > 5 и rule_num.isdigit(): ## ТОЛЬКО 6-значный single_rule_numbers.append(rule_num) elif '(' в Rule_num и ')' в Rule_num: если '-' и ',' в правиле_номер: maindigits = rule_num.split('(')[0] rangedigits = rule_num.split('(')[1][:-1] для копания в rangedigits.split(','): если '-' в копании: самая низкая_цифра, самая высокая_цифра = dig.split('-') если len(самая низкая_цифра) > 1: индекс = -1 в то время как int(самая низкая_цифра) < int(самая высокая_цифра)+1: digit_str = str(самая низкая_цифра) single_rule_numbers.append(maindigits+str(digit_str)) если int(самая низкая_цифра[индекс]) == 9: индекс -= 1 еще: самая низкая_цифра = самая низкая_цифра[:индекс] + str(int(самая низкая_цифра[индекс:])+1) еще: для копания в диапазоне (int(самая низкая_цифра), int(самая высокая_цифра)+1): single_rule_numbers.append(maindigits+str(dig)) еще: single_rule_numbers.append(основные цифры+копать) elif '-' в номере_правила и ',' не в номере_правила: ## 34(00-35), 34(21-48), 345(0-3) maindigits = rule_num.split('(')[0] rangedigits = rule_num.split('(')[1][:-1] самая низкая_цифра, самая высокая_цифра = диапазон цифр.split('-') если len(самая низкая_цифра) > 1: индекс = -1 в то время как int(самая низкая_цифра) < int(самая высокая_цифра)+1: digit_str = str(самая низкая_цифра) single_rule_numbers.append(maindigits+str(digit_str)) если int(самая низкая_цифра[индекс]) == 9: индекс -= 1 еще: самая низкая_цифра = самая низкая_цифра[:индекс] + str(int(самая низкая_цифра[индекс:])+1) еще: для копания в диапазоне (int(самая низкая_цифра), int(самая высокая_цифра)+1): single_rule_numbers.append(maindigits+str(dig)) elif ',' в правиле_номер и '-' не в правило_номер: ## 345(3,6,8), 34(28,34,53) maindigits = rule_num.split('(')[0] rangedigits = rule_num.split('(')[1][:-1].split(',') для копания в диапазоне цифр: single_rule_numbers.append(основные цифры+копать)
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение