Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 11

Регулярное выражение для парсинга функций

02.09.2019, 23:43. Показов 2203. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Каким регулярным выражением воспользоваться, чтобы спарсить все функции из файлов php?
Нужно название функции и её тело

PHP
1
2
3
function func_name(args) {
BODY
}
На pythex.org сработала вот такая регулярка: (function.*\{[\s\S]+?)+^\}$

В моём коде отказывается работать

Python
1
2
3
4
5
6
7
8
9
10
import re
 
test_f = open('functions.php', 'r', encoding="ISO-8859-1")
string  = test_f.read()
search = re.findall(r'(function.*\{[\s\S]+)+\}$', string)
i = 1
for func in search:
    with open('func/' + 'function' + str(i), 'a') as function:
        function.write(func)
        i += 1
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.09.2019, 23:43
Ответы с готовыми решениями:

Регулярное выражение для проверки lP-адреса
Напишите регулярное выражение для проверки lP-адреса (адрес по протоколу lP).

Написать регулярное выражение для float
ребят, возможно было уже, но я не нагуглил, суть - написать регулярное выражение для float но только, если в числе есть точка, пробую...

Регулярное выражение для студенческой группы
Здравствуйте. Помогите с регулярным выражением для студенческой группы. Примеры: ПРИм-171 Р-181 ИСТ-201 Бб-191

9
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
03.09.2019, 07:25
lOp4uk, а не проше читать только те строки что начинаются с function (игноря пробелы), затем разделяем по пробелу - то что в 1 части это сама function, во второй части только название с аргументами. Второую часть потом просто отделяем по скобке и все, никаких регулярок.
простой пример
Python
1
2
3
4
5
6
7
def parse_func(line):
    fun, *others = line.split(' ')
    name, args = ''.join(others).split("(")
    return fun, name, '('+args
 
 
print(parse_func('function my_func(arg, n1)'))
0
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 11
03.09.2019, 19:58  [ТС]
С названием функции и её аргументами всё просто, а вот тело ещё получить нужно как-то
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
03.09.2019, 20:04
lOp4uk, тут дело такое -я не знаю пхп и не знаю как может выглядеть код, так что помочь не могу, можешь попробовать регуляркой, я бы пробовал без оной.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
03.09.2019, 20:23
Для таких целей, я думаю, лучше юзать грамматику: https://github.com/antlr/gramm... master/php.
0
148 / 111 / 37
Регистрация: 28.11.2013
Сообщений: 383
03.09.2019, 21:13
re"function\s(\w+)\(\w+\)\s\{\s+(\w+)\s+ \}"

Где будет две группы, первый элемент массива - название функции, второй - body.
Тут надо доработать поиск body, какие символы там встречаются, надо вам выложить полный пример тела функции, чтобы было понятно что искать

Добавлено через 19 минут
Такой вариант немного лучше предыдущего:
re"function\s(\w+)\(\w+\)\s\{\s+([\w+|\s+]+)\s+\}"
0
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 11
07.09.2019, 14:43  [ТС]
Решил задачку своими силами, топик можно закрывать
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
07.09.2019, 14:59
Цитата Сообщение от lOp4uk Посмотреть сообщение
топик можно закрывать
Топик закрывает топикстартер(автор темы), отметив лучший ответ или предоставив собственный ответ и отметив его как лучший.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
08.09.2019, 16:01
lOp4uk, и если уж решил, чисто по-человечески было бы выложить решение на форум - вдруг кому пригодится?
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
09.09.2019, 10:38
Лучший ответ Сообщение было отмечено lOp4uk как решение

Решение

Мое решение:

Кликните здесь для просмотра всего текста

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
# -*- coding: utf-8 -*-
import re
 
example = """function func_name1($args) {
SHORT BODY
}
 
function func_name2($arg1, $arg2, $arg3) {
VERY
LONG
BODY
}
"""
 
pattern_func_name = r"(?=function\s*(\w+))"
pattern_func_args = r"(?=function\s*\w+\((.+)\))"
pattern_func_body = r"(?=function\s*\w+\(.+\)\s*\{\s*([\S\s]*?)\})"
pattern_func = r"(?=function\s*(\w+)\((.+)\)\s*\{\s*([\S\s]*?)\})"
 
for info in re.findall(pattern_func, example, re.MULTILINE): print(info)
 
# Вывод
# ('func_name1', '$args', 'SHORT BODY\n')
# ('func_name2', '$arg1, $arg2, $arg3', 'VERY\nLONG\nBODY\n')]
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.09.2019, 10:38
Помогаю со студенческими работами здесь

Регулярное выражение для выбора из текста
Подскажите пожалуйста, имеется текст формата: N1695870 R4('1) VD1('2); N164882 VT2('2) C1('1) C2('1) C4('1) R6('1) VT4('2)...

Регулярное выражение для поиска списка
Есть строка, в которой содержаться списки типа . В списке всегда 2 числа, разделенных запятой и пробелом. Количество знаков в дробной...

Регулярное выражение для проверки значения переменной
Составьте регулярное выражение для проверки значения переменной: быть иденти- фикатором языка Pascal. Напишите программу с...

Как сделать регулярное выражение для вывода пароля?
С помощью регулярных выражений нужно получить пароль из строки: mail - andrew404@mail.ru:secret_password140 | Нужно вывести лишь...

Составить регулярное выражение для фильтра расширений файлов
Хочу отобрать допустим только картинки но составлять весь список форматов для перебора занимает много времени. В одном из плагинов...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru