2024-04-26 18:35:30 发布
网友
为了为我的Python代码编写一个自定义文档生成器,我想编写一个正则表达式,它能够匹配以下内容:
def my_function(arg1,arg2,arg3): """ DOC """
我当前的问题是,使用以下正则表达式:
我只能匹配my_function、arg2和{}(根据Pythex.org网站). 在
my_function
arg2
我不明白我做错了什么,因为我的(?:(\w+),)*应该匹配尽可能多的参数,直到最后一个(这里是arg3)。有人能解释一下吗?在
(?:(\w+),)*
arg3
谢谢
这在一般意义上是不可能的,因为Python函数不是正则表达式,它们可以采用正则表达式语法无法捕捉的形式,尤其是在其他Python结构的上下文中。但请振作起来,从你的问题中可以学到很多东西!在
有趣的是,尽管你说你在学习正则表达式,但你却意外地进入了计算机科学本身的核心,编译器理论!在
在这篇文章中,我将不到冰山一角的一小部分来帮助你开始,然后建议一些免费和付费的资源来帮助你继续。在
python函数本身可以有几种形式:
def foo(x): "docstring" <body> def foo1(x): """doc string""" <body> def foo2(x): <body>
此外,在之前和之后的函数可能不是另一个函数!在
这就是使用正则表达式本身不可能自动生成文档的原因(对我来说不可能。我没有足够的智慧去写一个正则表达式来解释整个Python语言。在
您需要研究的是解析(顺便说一下,我使用术语解析非常松散地涵盖parsing, tokenizing, and lexing只是为了保持事情“简单”),使用正则表达式通常是解析的一个非常重要的部分。在
一般的策略是将文件解析成语法结构。确定哪些结构是函数。隔离该函数的文本。然后可以使用正则表达式来解析该构造的文本。或者您可以进一步解析一个层次,并将函数分解为不同的语法结构函数名、参数声明、文档字符串、正文等。。。到那时你的问题就会解决了。在
我试图为一个标准函数定义(没有解析)编写一个正则表达式,比如foo或{},但即使我已经编写了一些语言,也很难做到这一点。在
foo
简单地说,解析就是多行。Regex对单行线最有效。在
解析函数如下所示:
下面是真正的诀窍:这些parse函数都返回两个值:
parse
0)解析的regex块 1) 剩下的部分
比如说
def parse_name(lines): pattern = 'def\s*?([a-zA-Z_][a-zA-Z0-9_]*?)' for line in lines: m = re.match(pattern, line) if m: res, rest = m.groups() return res, [rest] + lines else: raise Exception("Line cannot be parsed by parse_name: {}".format(line))
因此,一旦您隔离了函数文本(这是另一整套技巧,通常包括创建一个称为“语法”的东西不用担心,我用下面的一些资源为您设置),您可以使用以下技术解析函数文本:
def parse_fn(lines_of_text): name, rest = parse_name(lines_of_text) params, rest = parse_params(rest) doc_string, rest = parse_doc(rest) body, rest = parse_body(rest) function = [name, params, doc_string, body] res = function, rest return res
这个函数将返回一些表示函数的数据结构(我只是用了一个简单的list)和其余的文本行。这将被传递到适当地编录您的function数据,然后对文本的rest进行分类和处理!在
list
function
rest
不管怎样,如果这是你感兴趣的事情,不要放弃!我想提出一些谦虚的建议:
1)从更容易解析的语言开始,比如Scheme/LISP。这些语言被设计成易于解析和操作!然后你就可以学习更多不规则的语言了。在
2a)彼得·诺维格(Peter Norvig)在这方面做了一些令人惊叹且非常容易理解的工作。退房Lispy!在
2b)peternorvig的课CS212(特别是第3单元code)非常具有挑战性,但在介绍基本语言设计概念方面做得非常出色。我得到的每一份工作,以及我对编程的热爱,都是因为那门课。在
3)如果你想让自己更进一步,而且你负担得起,我强烈建议你去看看戴夫·比泽利关于compilers或{a6}的研讨会。我从戴夫那里学了两门课,虽然我不能上体育课为了每个人,我的薪水每门课都翻了一番,所以我认为这是一项值得投资的投资。在
4)绝对检查计算机程序(向导书)和编译器(龙书)的结构和解释。他们会改变你的生活。在
5)不要放弃!你明白了!!祝你好运!在
这在一般意义上是不可能的,因为Python函数不是正则表达式,它们可以采用正则表达式语法无法捕捉的形式,尤其是在其他Python结构的上下文中。但请振作起来,从你的问题中可以学到很多东西!在
有趣的是,尽管你说你在学习正则表达式,但你却意外地进入了计算机科学本身的核心,编译器理论!在
在这篇文章中,我将不到冰山一角的一小部分来帮助你开始,然后建议一些免费和付费的资源来帮助你继续。在
python函数本身可以有几种形式:
此外,在之前和之后的函数可能不是另一个函数!在
这就是使用正则表达式本身不可能自动生成文档的原因(对我来说不可能。我没有足够的智慧去写一个正则表达式来解释整个Python语言。在
您需要研究的是解析(顺便说一下,我使用术语解析非常松散地涵盖parsing, tokenizing, and lexing只是为了保持事情“简单”),使用正则表达式通常是解析的一个非常重要的部分。在
一般的策略是将文件解析成语法结构。确定哪些结构是函数。隔离该函数的文本。然后可以使用正则表达式来解析该构造的文本。或者您可以进一步解析一个层次,并将函数分解为不同的语法结构函数名、参数声明、文档字符串、正文等。。。到那时你的问题就会解决了。在
我试图为一个标准函数定义(没有解析)编写一个正则表达式,比如},但即使我已经编写了一些语言,也很难做到这一点。在
foo
或{简单地说,解析就是多行。Regex对单行线最有效。在
解析函数如下所示:
^{pr2}$下面是真正的诀窍:这些
parse
函数都返回两个值:0)解析的regex块 1) 剩下的部分
比如说
因此,一旦您隔离了函数文本(这是另一整套技巧,通常包括创建一个称为“语法”的东西不用担心,我用下面的一些资源为您设置),您可以使用以下技术解析函数文本:
这个函数将返回一些表示函数的数据结构(我只是用了一个简单的
list
)和其余的文本行。这将被传递到适当地编录您的function
数据,然后对文本的rest
进行分类和处理!在不管怎样,如果这是你感兴趣的事情,不要放弃!我想提出一些谦虚的建议:
1)从更容易解析的语言开始,比如Scheme/LISP。这些语言被设计成易于解析和操作!然后你就可以学习更多不规则的语言了。在
2a)彼得·诺维格(Peter Norvig)在这方面做了一些令人惊叹且非常容易理解的工作。退房Lispy!在
2b)peternorvig的课CS212(特别是第3单元code)非常具有挑战性,但在介绍基本语言设计概念方面做得非常出色。我得到的每一份工作,以及我对编程的热爱,都是因为那门课。在
3)如果你想让自己更进一步,而且你负担得起,我强烈建议你去看看戴夫·比泽利关于compilers或{a6}的研讨会。我从戴夫那里学了两门课,虽然我不能上体育课为了每个人,我的薪水每门课都翻了一番,所以我认为这是一项值得投资的投资。在
4)绝对检查计算机程序(向导书)和编译器(龙书)的结构和解释。他们会改变你的生活。在
5)不要放弃!你明白了!!祝你好运!在
相关问题 更多 >
编程相关推荐