• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

[Python]Подскажите регулярку

Raskolnikov

Green Team
30.07.2017
67
21
BIT
0
Каким регулярным выражением воспользоваться, чтобы спарсить все функции из файлов php?
Нужно название функции и её тело
Код:
function func_name {
BODY
}
 
Скинь пример кода для теста, я в PHP не шарю.
Или можешь сам.

Python:
with open('s.txt', 'r', encoding='utf-8') as file:
    list = file.read().splitlines()
result = []
arefunc = False
start = 0
for wd in list:
    if wd != '':
        if wd.split()[0] == "function":
            start = list.index(wd)
            arefunc = True
        if wd.split()[-1][-1] == "}" and arefunc:
            result.append("\n".join([i for i in list[start:list.index(wd) + 1]]))
            arefunc = False
with open("funcs.txt", "w", encoding='utf-8') as file1:
    for i in result:
        file1.write(i)
file1.close()
 
Скинь пример кода для теста, я в PHP не шарю.
Или можешь сам.

Python:
with open('s.txt', 'r', encoding='utf-8') as file:
    list = file.read().splitlines()
result = []
arefunc = False
start = 0
for wd in list:
    if wd != '':
        if wd.split()[0] == "function":
            start = list.index(wd)
            arefunc = True
        if wd.split()[-1][-1] == "}" and arefunc:
            result.append("\n".join([i for i in list[start:list.index(wd) + 1]]))
            arefunc = False
with open("funcs.txt", "w", encoding='utf-8') as file1:
    for i in result:
        file1.write(i)
file1.close()

Проверил, очень не корректно работает. Щас попробую подкорректировать код. Файл для теста
 
Решил задачу своими силами
Если при написание php кода используются пробелы, меняем '\t' на 4 пробела
Python:
import sys
import re


with open(sys.argv[1], 'r', encoding = 'ISO-8859-1') as code:
    code_list = code.read().splitlines()

num_list = []
for string in code_list:
    search = re.search(r'function\s\w+\(.*\)', string)
    if search:
        num_list.append(code_list.index(string))
for num in num_list:
    code_list_copy = code_list.copy()
    a = int(num)
    del code_list_copy[0:a]
    for line in code_list_copy:
        search = re.search(r'function\s\w+\(.*\)', line)
        if search:
            try:
                count_tab = len(re.search('\t', line).group(0))
            except:
                count_tab = 0
            with open('result.txt', 'a', encoding = 'ISO-8859-1') as result:
                result.write(line + '\n')
        elif ('\t' + '\t' * count_tab) in line:
            with open('result.txt', 'a', encoding = 'ISO-8859-1') as result:
                result.write(line + '\n')
        brace = re.search('^' + '\t' * count_tab + '}$', line)
        if brace:
            with open('result.txt', 'a', encoding = 'ISO-8859-1') as result:
                result.write('}\n')
            break
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!