powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Python] Регулярное выражение для парсинга программного кода.
16 сообщений из 16, страница 1 из 1
[Python] Регулярное выражение для парсинга программного кода.
    #37968405
Relrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал такую регулярку: (?<!.)[_a-z][_a-zA-Z0-9]*|[\s]+[_a-z][_a-zA-Z0-9]*
Но она не вылавливает все переменные языка программирования и захватывает частично строки. Что нужно исправить/добавить, чтобы можно было "отловить" только переменные?

Исходный код:
Код: ruby
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.
32.
33.
34.
35.
app = TkRoot.new { 
     title "Hello Tk!"; padx 50; pady 15 
}

lbl = TkLabel.new(app) { 
     text "Something wasn't clicked yet..." 
     pack { padx 100; pady 100; side "left" } 
}
java_clicked = Proc.new { 
     lbl.text "Java was liked..."
}
sc_clicked = Proc.new { 
     lbl.text "Scala was liked..."
}
cpp_clicked = Proc.new { 
     lbl.text "C++ was liked..."
}
py_clicked = Proc.new { 
     lbl.text "Python was liked..."
}
rb_clicked = Proc.new { 
     lbl.text "Ruby was liked..."
}
menu = TkMenu.new(app 
menu.add('command', 'label' => "Java", 'command' => java_clicked) 
menu.add('command', 'label' => "Scala", 'command' => sc_clicked) 
menu.add('separator')
menu.add('command', 'label' => "C++", 'command' => cpp_clicked) 
menu.add('separator') 
menu.add('command', 'label' => "Python", 'command' => py_clicked) 
menu.add('command', 'label' => "Ruby", 'command' => rb_clicked) 
bar = TkMenu.new 
bar.add('cascade', 'menu' => menu, 'label' => "Click me, I want you!") 
app.menu(bar)
Tk.mainloop
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968588
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relrin,

Код: php
1.
2.
preg_match_all('/^(\w+)\s*=/m', $contents, $out);
print_r($out[1]);
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968661
Relrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanRelrin,

Код: php
1.
2.
preg_match_all('/^(\w+)\s*=/m', $contents, $out);
print_r($out[1]);


У меня регулярка эта не работает почему-то...
П.С. Пишу на Python'е
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968687
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relrin,

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
import re

def get_vars(file_py):
  varlist = []
  with open(file_py) as f:
    for line in f.readlines():
      varlist += re.findall("^(\w+)\s*=", line.rstrip())

  return varlist

print get_vars('source.py')
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968704
Relrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanRelrin,

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
import re

def get_vars(file_py):
  varlist = []
  with open(file_py) as f:
    for line in f.readlines():
      varlist += re.findall("^(\w+)\s*=", line.rstrip())

  return varlist

print get_vars('source.py')


Спасибо. Работает :)
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968707
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relrin,

Можно еще и так сделать (учитывая возможности Питона), например:
Код: python
1.
2.
3.
4.
5.
# test.py

a = 1
b = 2
c = 3

Код: python
1.
2.
3.
4.
5.
# test2.py

import test

print [var for var in dir(test) if not var.startswith('__')]
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968727
Relrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возник с переменными, которые объявляеются в первый раз, все понятно, а вот как выщемить переменных, которые уже далее где-то используюся (т.е. как в качестве параметра, или части объекта). На примере выделил жирными цветом. Как это сделать?
menu .add('command', 'label' => "Java", 'command' => java_clicked )
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968740
Relrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
^\s*(\w+)\s*=|^\s*(\w+)
Щемит такие выражения(выделено жирным), а то что, подчеркнуто, не выделяет, хотя неплохобы, чтобы их из брало:

Код: ruby
1.
2.
3.
4.
5.
6.
7.
rb_clicked = Proc.new 
{ 
     lbl.text "Ruby was liked..."
}
menu = TkMenu.new(app 
menu.add('command', 'label' => "Java", 'command' => java_clicked) 
menu.add('command', 'label' => "Scala", 'command' => sc_clicked) 
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968742
Relrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
^\s*(\w+)\s*[.]* - все-таки вот так выглядит лучше

rb_clicked = Proc.new
{
lbl. text "Ruby was liked..."
}
menu = TkMenu.new(app
menu. add('command', 'label' => "Java", 'command' => java_clicked )
menu. add('command', 'label' => "Scala", 'command' => sc_clicked )
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968807
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relrinа то что, подчеркнуто Реализовать одной регуляркой будет сложно. Лучше в два захода.
Сначала перебираете определения/объявления переменных.
Получаете список и делаете поиск по тексту (с небольшой модификацией).

А если вам нужен анализатор исходного кода, тогда сюда: http://wiki.python.org/moin/LanguageParsing
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968823
Relrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quote автор]UsmanRelrinа то что, подчеркнуто Реализовать одной регуляркой будет сложно. Лучше в два захода.
Сначала перебираете определения/объявления переменных.
Получаете список и делаете поиск по тексту (с небольшой модификацией).
Да, я додумался в 2 захода сделать.
Вот допустим, из исходного кода мне (1ый пост), вернуло список тех переменных, которые объявлены впервые с использованием присваивания (знака "=") и использовали для этого регулярку "^\s*(\w+)\s*=":

menu
app
lbl
java_clicked
sc_clicked
cpp_clicked
py_clicked
bar
rb_clicked

Теперь нужно все пересчитать. Выбираем элемент из списка, и подставив в ключ нужно найти данные, записать с словарь. Как распарсерить, если операторов в Ruby, предостаточно? Просто все скидывать в [^оператор*..] ?
Основные операторы раби:
=
+
-
%
&
*
**
/
|
||
>>
<<
.eql?
equal?
+=
-=
*=
/=
%=
**=
or
and
not


П.С. Функцию отдельно я написал, которая в словарь потом отдельно преобразует, подсчитав сколько раз встречался этот элемент.
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968827
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968832
Relrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UsmanRelrin,

http://py2rb.sourceforge.net/

Проект "мертвый", скачать ничего невозможно (репозитарий пустой)
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37968837
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relrin(репозитарий пустой) Извиняюсь... Попытаюсь реабилитироваться :)

- https://github.com/whymirror/unholy
- http://www.goto.info.waseda.ac.jp/~fukusima/ruby/python-e.html
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37970677
Relrin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
\s*(\w+)\s*[.] - как можно подкорректировать данную регулярку, чтобы она брало имя переменной/объекта до точки(выделено жирным), но не выбирало, что подчеркнуто?
asd.hello()
rb_clicked = Proc.new { # ловим клик "Ruby" в меню
lbl. text "Ruby was liked..."
}
...
Рейтинг: 0 / 0
[Python] Регулярное выражение для парсинга программного кода.
    #37972183
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Python] Регулярное выражение для парсинга программного кода.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]