Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Вирусоборец
 Аватар для thyrex
14450 / 7489 / 1582
Регистрация: 06.09.2009
Сообщений: 27,133

Нужна помощь с регулярками

09.03.2024, 20:50. Показов 557. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется скрипт (взят на зарубежном форуме), который должен парсить выражения (в оригинале читаются из файлов, число строк в которых исчисляется десятками тысяч), заменяя постфиксные обозначения в читаемые названия функции. Работает с ошибками.

Нужна помощь в исправлении регулярного выражения и правильных вызовов методов библиотеки re. Строки, где явно нужны исправления, отмечены тремя восклицательными знаками.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import re
 
POSTFIX_OPS = {
    '!': 'factorial', 
    '##': 'primorial2',
    '#': 'primorial'
}
 
FUNCTION_ARG_REGEX = '[0-9]+|[A-Za-z]+\([0-9]+\)' # !!!
 
def _postfix_parse(arg, ops):
    # Parses a token followed by arbitray number of postfix operators
    expr_in = arg+ops
    expr_out = arg
    for op in filter(bool, re.split(r'(!|##|#)', ops)): # !!!
        expr_out = f'{POSTFIX_OPS[op]}({expr_out})'
    return expr_in, expr_out
 
def parse(expr):
    # Fix postfix functions to named functions
    for arg, ops in re.findall(f'({FUNCTION_ARG_REGEX})([!#]+)', expr): # !!!
        expr_in, expr_out = _postfix_parse(arg, ops)
        expr = expr.replace(expr_in, expr_out)
    return expr
 
st_in = input()
st_out = parse(st_in)
st_out = parse(st_out)
print(st_out)
Примеры входных и правильных выходных под спойлером

Кликните здесь для просмотра всего текста
Ввод: (60#/246+60##+3)/17419480963334
Вывод: (primorial(60)/246+primorial2(60)+3)/17419480963334

Ввод: ((5^8)!/390600!+I(31))/3834979608303473780687302839095501533
Вывод: (factorial(5**8))/factorial(390600)+I(31))/3834979608303473780687302839095501533

Ввод: (10^5!*15!+I(7#))/40054989371636513941604383160
Вывод: (10**factorial(5)*factorial(15)+I(primor ial(7)))/40054989371636513941604383160

Ввод: (10^5!*15!+I(7#))/40054989371636513941604383160
Вывод: (10**factorial(5)*factorial(15)+I(primor ial(7)))/40054989371636513941604383160

Ввод: (100^7#+997#+61)/6645533633287187539
Вывод: (100**primorial(7)+primorial(997)+61)/6645533633287187539
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.03.2024, 20:50
Ответы с готовыми решениями:

Нужна помощь
Проверьте пожалуйсто правильность программы, а то она какой то бред выдает! n=input ('Прошу вас вести значение n пожалуйсто:') a=1 ...

Нужна чья-то помощь
выведите 3*3 изображений, используя графическую библиотеку TKINTER

Нужна помощь с функцией
Подскажите, пожалуйста, как с помощью функции отсортировать введенные пользователем слова по количеству согласных букв в этих же словах?

3
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
09.03.2024, 22:55
Лучший ответ Сообщение было отмечено thyrex как решение

Решение

Скобка лишняя


не мудрствуя лукаво ))
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import re
 
POSTFIX_OPS = {
    '##': 'primorial2',
    '#': 'primorial',
    '!': 'factorial'
}
 
 
def foo(s: str) -> str:
    s = s.replace('^', '**')
    s = re.sub(r'(\d+)(##|#|!)', lambda x: f'{POSTFIX_OPS[x[2]]}({x[1]})', s)
    s = re.sub(r'\(([^)(]+?)\)!', lambda x: f'{POSTFIX_OPS["!"]}({x[1]})', s)
    return s
 
# -------------------------------------------------------------------------------------------------------
 
assert foo('(60#/246+60##+3)/17419480963334') \
       == '(primorial(60)/246+primorial2(60)+3)/17419480963334'
 
assert foo('((5^8)!/390600!+I(31))/3834979608303473780687302839095501533') \
       == '(factorial(5**8)/factorial(390600)+I(31))/3834979608303473780687302839095501533'
 
assert foo('(10^5!*15!+I(7#))/40054989371636513941604383160') \
       == '(10**factorial(5)*factorial(15)+I(primorial(7)))/40054989371636513941604383160'
 
assert foo('(10^5!*15!+I(7#))/40054989371636513941604383160') \
       == '(10**factorial(5)*factorial(15)+I(primorial(7)))/40054989371636513941604383160'
 
assert foo('(100^7#+997#+61)/6645533633287187539') \
       == '(100**primorial(7)+primorial(997)+61)/6645533633287187539'
2
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
09.03.2024, 22:59
Лучший ответ Сообщение было отмечено thyrex как решение

Решение

Python
1
2
3
def foo(s: str) -> str:
    s = re.sub(r'(\d+)(##|#|!)', lambda x: f'{POSTFIX_OPS[x[2]]}({x[1]})', s.replace('^', '**'))
    return re.sub(r'\(([^)(]+?)\)!', lambda x: f'{POSTFIX_OPS["!"]}({x[1]})', s)
2
Вирусоборец
 Аватар для thyrex
14450 / 7489 / 1582
Регистрация: 06.09.2009
Сообщений: 27,133
09.03.2024, 23:16  [ТС]
iSmokeJC, спасибо. Буду тестировать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.03.2024, 23:16
Помогаю со студенческими работами здесь

СРОЧНО НУЖНА ПОМОЩЬ! Нужна информация о тест оборудовании
Доброго времени суток! Интересует информация (книги, статьи, научные статьи, сайты, зарубежная приветствуется) о проектировании...

Нужна помощь!
Помогите решить. 1. В произвольном массиве поменяйте местами соседние четные и нечетные по номеру элементы. Дополнительные массивы не...

Нужна помощь
Суть в том, что чаще в играх пишу на клавитуре идёт задержка 1-2 секи, сразу говорю с интернетам проблем нету. Раньше встречался такое...

Нужна помощь
Есть дата логическая схема данных, но помимо нее нужна еще и инфо логическая схема( как ее составлять пропустил по болезни) а завтро надо...

Нужна помощь
Поблема в следующем: работаем на сайте, при попытке онлайн сохранить на нем данные через скрипт, сайт в большинстве случаев это игнорирует....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru