3

所以,是的,标题很奇怪,但我不知道如何正确描述我的问题。无论如何...让我们解决问题。

要完成的工作

我的老板想要一个读取 python 文件的所有函数并返回包含找到的函数的 DataTable 的函数。这个函数应该用 IronPython(实际上使用 C# 库的 Python)编写。

问题

我对 Python 比较陌生,我不知道这种语言能做什么,所以我开始编写我的函数,是的,它工作得很好,除了一个奇怪的问题。我写了一个正则表达式来查找函数并对其进行测试,我下载了一个 RegEx Tester。正则表达式测试器显示了我想要的结果:第 1 组 - 函数名称,第 2 组 - 函数参数和第 3 组 - 函数的内容。

由于一些神奇的原因,它在进行实时测试时不起作用。我的意思是不起作用,第 3 组实际上没有输出。在用另一个(在线)RegEx Tester测试表达式后,它告诉我,第 3 组实际上没有函数的内容,它只有一小部分,以换行符/回车符开头。

在我的测试用例中,第 3 组的结果都是一样的,以换行符/返回字符开始并以函数返回(例如返回 objDic)结束。

问题:那里到底出了什么问题?我不知道我的 RegEx 出了什么问题。

正则表达式

objRegex = Regex(r"(?i)def[\s]+([\w]+)\(([\, [\w]+)\)(?:[\:{1}]\s*)([\n].*(?!\ndef[\s]+))+")

数据

def test_function(some_parameter):
    try:
        some_cool_code_goes_here()
        return obj
    except Exception as ex:
        DetailsBox.Show(ex)

def another_cool_function(another_parameter):
    try:
        what_you_want()
        return obj
    except Exception as ex:
        DetailsBox.Show(ex)

结果

匹配: def test_function(some_parameter):...
位置: ..
长度: ..
第 1 组: test_function
第 2 组: some_parameter
第 3 组:( 换行符/返回字符) 返回 obj

但是第 3 组应该是:

    try:
        some_cool_code_goes_here()
        return obj
    except Exception as ex:
        DetailsBox.Show(ex)

我希望你能帮助我:3谢谢你们!

4

2 回答 2

2

虽然@Hamza 在他的评论中说你的正则表达式有几个问题,但我认为它们更多的是不必要的复杂性,不匹配正文的原因可能是你没有让.特殊的元字符匹配新行所以它在第一条Try:语句之后的第一个换行符处停止。

要解决此问题,您需要.匹配换行符,这是您的正则表达式的精简版本,它可以工作:

(?i)def\s+(\w+)\s*\(([\, \w]+)\)(?:\s*:\s*)(.+?)(?=def|$)
于 2013-08-14T13:25:11.670 回答
1

感谢HamZa的快速帮助(当然也感谢所有其他帮助者),他实际上解决了这个问题。只需要进行一些调整(使其适用于 C# :-))但要点来自他,非常感谢。

我的问题的解决方案:

Regex(r"(?is)def\s*(?<name>\w+)\s*\((?<parameter>[^)]+)\)\s*:\s*(?:\r?\n)+(?<body>.*?)(?=\r?\ndef|$)")
于 2013-08-14T13:36:52.447 回答