æ§æ解æïŒæ§æ解æïŒã¯ãäžé£ã®åèªãŸãã¯æåãç
§åããããã»ã¹ã§ã-ãããã圢åŒææ³ã ããšãã°ã次ã®ã³ãŒãè¡ã®å ŽåïŒ
import matplotlib.pyplot as plt
次ã®ææ³ãè¡ãããŸãïŒæåã«ããŒã¯ãŒãimportã次ã«ã¢ãžã¥ãŒã«ã®ååãŸãã¯ãããã§åºåãããã¢ãžã¥ãŒã«åã®ãã§ãŒã³ã次ã«ããŒã¯ãŒãasã次ã«ã€ã³ããŒããããã¢ãžã¥ãŒã«ã®ååãç¶ããŸãã
ããšãã°ã解æã®çµæãšããŠã次ã®åŒã«å°éããå¿
èŠãããå ŽåããããŸãã
{ 'import': [ 'matplotlib', 'pyplot' ], 'as': 'plt' }
ãã®åŒã¯ããimportããšãasãã®2ã€ã®ããŒãæã€PythonèŸæžã§ãã ãã€ã³ããŒããããŒã®å€ã¯ãã€ã³ããŒããããã¢ãžã¥ãŒã«ã®ååãé çªã«ãªã¹ããããŠãããªã¹ãã§ãã
解æã«ã¯ãéåžžãæ£èŠè¡šçŸã䜿çšãããŸãã ãããè¡ãããã«ãreïŒæ£èŠè¡šçŸïŒãšåŒã°ããPythonã¢ãžã¥ãŒã«ããããŸãã æ£èŠè¡šçŸã䜿çšããããšããªãå Žåã¯ããã®å€èŠ³ãæããããããŸããã äŸãã°ãã³ãŒãè¡ãmatplotlib.pyplotãpltãšããŠã€ã³ããŒããã®å Žåã次ã®ããã«ãªããŸãã
r'^[ \t]*import +\D+\.\D+ +as \D+'
幞ããªããšã«ãPyparsingãšåŒã°ãã䟿å©ã§æè»ãªè§£æããŒã«ããããŸãã äž»ãªå©ç¹ã¯ãã³ãŒããèªã¿ãããããåæãããããã¹ããããã«åŠçã§ããããšã§ãã
ãã®èšäºã§ã¯ãPyparsingãã€ã³ã¹ããŒã«ããæåã®ããŒãµãŒãäœæããŸãã
æåã«Pyparsingãã€ã³ã¹ããŒã«ããŸãã Linuxã§äœæ¥ããŠããå Žåã¯ãã³ãã³ãããã³ããã§æ¬¡ã®ããã«å
¥åããŸãã
sudo pip install pyparsing
Windowsã§ã¯ã管çè
ãšããŠèµ·åãããã³ãã³ãã©ã€ã³ã§ãæåã«pip.exeãã¡ã€ã«ããããã£ã¬ã¯ããªïŒããšãã°ãCïŒ\ Python27 \ Scripts \ïŒã«ç§»åããŠããå®è¡ããå¿
èŠããããŸãã
pip install pyparsing
å¥ã®æ¹æ³ã¯
ãSourceForgeã®Pyparsingãããžã§ã¯ãããŒãžã«ç§»åã
ãããã«Windowsçšã®ã€ã³ã¹ããŒã©ãŒãããŠã³ããŒãããŠãéåžžã®ããã°ã©ã ãšããŠPyparsingãã€ã³ã¹ããŒã«ããããšã§ãã Pyparsingãã€ã³ã¹ããŒã«ãããã¹ãŠã®å¯èœãªæ¹æ³ã«é¢ããå®å
šãªæ
å ±ã¯
ããããžã§ã¯ãããŒãžã«ãããŸã ã
æ§æ解æã«ç§»ããŸãããã sã次ã®è¡ã«ããŸãã
s = 'import matplotlib.pyplot as plt'
解æã®çµæãšããŠãèŸæžãååŸãããïŒ
{ 'import': [ 'matplotlib', 'pyplot' ], 'as': 'plt' }
ãŸããPyparsingãã€ã³ããŒãããå¿
èŠããããŸãã ããšãã°Python IDLEãå®è¡ããŠã次ã®ããã«å
¥åããŸãã
from pyparsing import *
äžèšã®ã¢ã¹ã¿ãªã¹ã¯*ã¯ãpyparsingãããã¹ãŠã®ååãã€ã³ããŒãããããšãæå³ããŸãã ãã®çµæãååã®ã¯ãŒã¯ã¹ããŒã¹ãæ··ä¹±ããããã°ã©ã ã§ãšã©ãŒãçºçããå¯èœæ§ããããŸãã ç§ãã¡ã®å Žåã䜿çšããPyparsingã®ã¯ã©ã¹ããŸã ããããªãããã*ãäžæçã«äœ¿çšãããŸãã ããŒãµãŒãèšè¿°ããåŸã*ã䜿çšããã¯ã©ã¹ã®ååã«çœ®ãæããŸãã
pyparsingã䜿çšããå ŽåãããŒãµãŒã¯æåã«åã
ã®ããŒã¯ãŒããæåãçããã¬ãŒãºã«å¯ŸããŠæžã蟌ãŸãã次ã«ããã¹ãå
šäœã®ããŒãµãŒãåã
ã®éšåããååŸãããŸãã
ãŸããè¡ã«ã¢ãžã¥ãŒã«åããããŸãã æ£åŒãªææ³ïŒäžè¬çãªå Žåãã¢ãžã¥ãŒã«ã®ååã¯æåãšã¢ã³ããŒã¹ã³ã¢ã§æ§æãããåèªã§ãã pyparsingã«ã€ããŠïŒ
module_name = Word(alphas + '_')
åèªã¯åèªãã¢ã«ãã¡ã¯æåã§ãã
Word(alphas + '_')
-æåãšã¢ã³ããŒã¹ã³ã¢ã§æ§æãããåèªã module_nameã¯ã¢ãžã¥ãŒã«ã®ååã«å€æãããŸãã ããã§ãã¹ãŠãäžç·ã«èªã¿ãŸããã¢ãžã¥ãŒã«ã®ååã¯ãæåãšã¢ã³ããŒã¹ã³ã¢ã§æ§æãããåèªã§ãã ãããã£ãŠãPyparsingãšã³ããªã¯èªç¶èšèªã«éåžžã«è¿ããã®ã§ãã
ã¢ãžã¥ãŒã«ã®å®å
šãªååã¯ããã§ãŒã³ã®ã¢ãžã¥ãŒã«ã«å°éãããŸã§ãã¢ãžã¥ãŒã«ã®ååã次ã«ãããã次ã«å¥ã®ã¢ãžã¥ãŒã«ã®ååã次ã«åã³ãããã次ã«3çªç®ã®ã¢ãžã¥ãŒã«ã®ååããšããããã«ç¶ããŸãã ã¢ãžã¥ãŒã«ã®ãã«ããŒã ã¯ã1ã€ã®ã¢ãžã¥ãŒã«ã®ååã§æ§æãããããªãªããæããªãå ŽåããããŸãã pyparsingã«ã€ããŠïŒ
full_module_name = module_name + ZeroOrMore('.' + module_name)
ZeroOrMoreã¯æåéãããŒã以äžãã«å€æãããŸããã€ãŸããæ¬åŒ§å
ã®ã³ã³ãã³ããæ°åç¹°ãè¿ãããããæ¬ èœããå¯èœæ§ããããŸãã ãã®çµæãããŒãµãŒã®2è¡ç®å
šäœãèªã¿åããŸããã¢ãžã¥ãŒã«ã®å®å
šãªååã¯ã¢ãžã¥ãŒã«ã®ååã§ããããã®åŸãããããšã¢ãžã¥ãŒã«ã®ååã¯0å以äžç¶ããŸãã
ã¢ãžã¥ãŒã«ã®ãã«ããŒã ã®åŸã«ããªãã·ã§ã³ã®éšåãas pltããç¶ããŸãã ããŒã¯ãŒã 'as'ã®åŸã«ãã€ã³ããŒãããã¢ãžã¥ãŒã«ã«ä»ããååãç¶ããŸãã pyparsingã«ã€ããŠïŒ
import_as = Optional('as' + module_name)
ãªãã·ã§ã³ã¯æåéãããªãã·ã§ã³ãã«å€æãããŸããã€ãŸããæ¬åŒ§å
ã®ã³ã³ãã³ããååšããå Žåãšååšããªãå ŽåããããŸãã åèšã§ããasããšããåèªãšã¢ãžã¥ãŒã«åã§æ§æããããªãã·ã§ã³ã®åŒãåŸãããŸãã
å®å
šãªimportã¹ããŒãã¡ã³ãã¯ãimportããŒã¯ãŒããã¢ãžã¥ãŒã«ã®ãã«ããŒã ããªãã·ã§ã³ã®ãas pltãã³ã³ã¹ãã©ã¯ãã§æ§æãããŸãã pyparsingã«ã€ããŠïŒ
parse_module = 'import' + full_module_name + import_as
ãã®çµæãæåã®ããŒãµãŒãã§ããŸããã
module_name = Word(alphas + '_') full_module_name = module_name + ZeroOrMore('.' + module_name) import_as = Optional('as' + module_name) parse_module = 'import' + full_module_name + import_as
次ã«ãæååsã解æããå¿
èŠããããŸãã
parse_module.parseString(s)
ååŸããŸãïŒ
(['import', 'matplotlib', '.', 'pyplot', 'as', 'plt'], {})
çµæããªã¹ãã«å€æããããšã«ãããåºåãæ¹åã§ããŸãã
parse_module.parseString(s).asList()
ååŸãããã®ïŒ
['import', 'matplotlib', '.', 'pyplot', 'as', 'plt']
次ã«ãããŒãµãŒãæ¹åããŸãã ãŸããããŒãµãŒåºåã§importãšããåèªãšã¢ãžã¥ãŒã«åã®éã®ããããèŠãããªãã§ãããã SuppressïŒïŒã¯ãåºåãæå¶ããããã«äœ¿çšãããŸãã ããã念é ã«çœ®ããŠãããŒãµãŒã¯æ¬¡ã®ããã«ãªããŸãã
module_name = Word(alphas + '_') full_module_name = module_name + ZeroOrMore(Suppress('.') + module_name) import_as = Optional(Suppress('as') + module_name) parse_module = Suppress('import') + full_module_name + import_as
parse_module.parseString(s).asList()
ã次ã®ããã«ãªããŸãã
['matplotlib', 'pyplot', 'plt']
ããŒãµãŒã«ãããã«
{'import':[1, 2, ...], 'as':}
ãšãã圢åŒã®èŸæžãè¿ãããã«ããŸãããã ãããè¡ãåã«ããŸãã€ã³ããŒãããã¢ãžã¥ãŒã«ã®ãªã¹ãïŒfull_module_nameïŒãšç¬èªã®ã¢ãžã¥ãŒã«åïŒimport_asïŒã«åå¥ã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸãã ãã®ãããpyparsingã§ã¯è§£æçµæã«ååãå²ãåœãŠãããšãã§ããŸãã ã€ã³ããŒããããã¢ãžã¥ãŒã«ã®ãªã¹ãã«ãã¢ãžã¥ãŒã«ããšããååãä»ããŸãããããããŠãç§ãã¡ãã¢ãžã¥ãŒã«ãšåŒãã§ããããã«ããã€ã³ããŒãããããšããååãä»ããŸãã
full_module_name = (module_name + ZeroOrMore(Suppress('.') + module_name))('modules') import_as = (Optional(Suppress('as') + module_name))('import_as')
äžèšã®2è¡ãããããããã«ã解æçµæã«ååãä»ããã«ã¯ãããŒãµãŒåŒãè§ãã£ãã§å²ã¿ãæ¬åŒ§å
ã®ãã®åŒã®åŸã«çµæã®ååãä»ããå¿
èŠããããŸãã äœãå€ãã£ãã®ãèŠãŠã¿ãŸãããã ãããè¡ãã«ã¯ãã³ãŒããå®è¡ããŸãïŒ
res = parse_module.parseString(s) print(res.modules.asList()) print(res.import_as.asList())
ååŸãããã®ïŒ
['matplotlib', 'pyplot'] ['plt']
ããã§ãã¢ãžã¥ãŒã«ã®ãã§ãŒã³ãåå¥ã«æœåºããŠãç®çã®ã¢ãžã¥ãŒã«ãšãã®ååãã€ã³ããŒãã§ããŸãã ããŒãµãŒãèŸæžãè¿ãããã«ããããšã¯æ®ã£ãŠããŸãã ãã®ããã«ãããããParseActionã䜿çšãããŸã-解æäžã®ã¢ã¯ã·ã§ã³ïŒ
parse_module = (Suppress('import') + full_module_name).setParseAction(lambda t: {'import': t.modules.asList(), 'as': t.import_as.asList()[0]})
lambdaã¯Pythonã®å¿åé¢æ°ã§ãtã¯ãã®é¢æ°ã®åŒæ°ã§ãã 次ã«ãã³ãã³ãšPythonèŸæžã®åŒãå¿
èŠã«ãªããŸãã asListïŒïŒãåŒã³åºããšããªã¹ããååŸãããŸãã asã®åŸã®ã¢ãžã¥ãŒã«ã®ååã¯åžžã«1ã§ããããªã¹ã
t.import_as.asList()
ã¯åžžã«1ã€ã®å€ã®ã¿ãå«ãŸããŸãã ãããã£ãŠããªã¹ãã®å¯äžã®èŠçŽ ïŒã€ã³ããã¯ã¹ããŒãïŒãååŸããasListïŒïŒ[0]ãèšè¿°ããŸãã
ããŒãµãŒã確èªããŠãã ããã
parse_module.parseString(s).asList()
ãå®è¡ãã
parse_module.parseString(s).asList()
ãååŸããŸãã
[{ 'import': [ 'matplotlib', 'pyplot' ], 'as': 'plt' }]
ããããã§ãã çµæã®ãªã¹ãã«ã¯åŒæ°ã1ã€
parse_module.parseString(s).asList()[0]
ãããè¡ã®æ«å°Ÿã«[0]ãè¿œå ããŠããã¹ãã解æããŸã
parse_module.parseString(s).asList()[0]
parse_module.parseString(s).asList()[0]
èŠçŽãããšïŒ
{ 'import': [ 'matplotlib', 'pyplot' ], 'as': 'plt' }
欲ãããã®ãæã«å
¥ããŸããã
ç®æšãéæãããããfrom pyparsing import *ãã«æ»ããã¢ã¹ã¿ãªã¹ã¯ãæçšãªã¯ã©ã¹ã«å€æŽããå¿
èŠããããŸãã
from pyparsing import Word, alphas, ZeroOrMore, Suppress, Optional
ãã®çµæãã³ãŒãã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
from pyparsing import Word, alphas, ZeroOrMore, Suppress, Optional module_name = Word(alphas + "_") full_module_name = (module_name + ZeroOrMore(Suppress('.') + module_name))('modules') import_as = (Optional(Suppress('as') + module_name))('import_as') parse_module = (Suppress('import') + full_module_name + import_as).setParseAction(lambda t: {'import': t.modules.asList(), 'as': t.import_as.asList()[0]})
éåžžã«åçŽãªäŸãšãPyparsingã®æ©èœã®ããäžéšã®ã¿ãæ€èšããŸããã ãªãŒããŒããŒã-ååž°åŒã®äœæãããŒãã«ã®åŠçãæ€çŽ¢èªäœãåçã«é«éåããæé©åã䌎ãããã¹ãæ€çŽ¢ãªã©ã
çµè«ãšããŠãããªãèªèº«ã«ã€ããŠã®ããã€ãã®èšèã ç§ã¯å€§åŠé¢çã§ãããMSTUã®ã¢ã·ã¹ã¿ã³ãã§ãã ããŠãã³ïŒMT-1ãéå±åææ©ãã®éšïŒã PythonãLinuxãHTMLãCSSãJSã奜ãã§ãã ç§ã®è¶£å³ã¯ãå·¥åŠæŽ»åãšå·¥åŠèšç®ã®èªååã§ãã ãã€ããŒã·ã³ã°ãã»ãŒãžãããã³ãšã³ãžãã¢ãªã³ã°èšç®ã®èªååã®ããã€ãã®æ©èœã§ã®äœæ¥ã«é¢ããç¥èãå
±æããHabrã«åœ¹ç«ã€ãšæããŸãã Wolfram Alphaã®åŒ·åãªä»£æ¿æ段ã§ããSageMathCloudç°å¢ãç¥ã£ãŠããŸãã SageMathCloudã¯ãã¯ã©ãŠãã§ã®Pythonèšç®ã察象ãšããŠããŸãã åæã«ãã³ã³ãœãŒã«ïŒãã³ãããã®äžã®UbuntuïŒãSageãIPythonãLaTeXã«ã¢ã¯ã»ã¹ã§ããŸãã ã³ã©ãã¬ãŒã·ã§ã³ã®å¯èœæ§ããããŸãã Pythonã³ãŒãã«å ããŠãSageMathCloudã¯htmlãcssãjsãcoffescriptãgoãfortranãscilabãªã©ããµããŒãããŠããŸãã çŸåšããã®ç°å¢ã¯ç¡æã§ïŒããªãå®å®ããããŒã¿çïŒãããªãŒãã¢ã ã·ã¹ãã ã§åäœããŸãã çŸæç¹ã§ã¯ããã®ç°å¢ã¯Habréã§ã«ããŒãããŠããŸããããã®ã®ã£ãããåããããšæããŸãã
èšäºã®ç·šéã«ååããŠãããDaria FrolovaãšNikita Konovalovã«æè¬ããŸãã