我正在尝试创建一个Python函数,它可以对正则表达式进行简单的英语描述,并将正则表达式返回给调用者.
目前我正在考虑YAML格式的描述.因此,我们可以将描述存储为原始字符串变量,将其传递给另一个函数,然后将该函数的输出传递给"re"模块.以下是一个相当简单的例子:
# a(b|c)d+e*
re1 = """
- literal: 'a'
- one_of: 'b,c'
- one_or_more_of: 'd'
- zero_or_more_of: 'e'
"""
myre = re.compile(getRegex(re1))
myre.search(...)
Run Code Online (Sandbox Code Playgroud)
等等
有没有人认为这种东西会被广泛使用?你知道现有的包可以做到吗?您对此方法有何限制?有人认为,在代码中使用声明性字符串会使其更易于维护吗?
这实际上与词法分析器/解析器的工作方式非常相似(相同?).如果你有一个定义的语法,那么你可能会编写一个没有太多麻烦的解析器.例如,你可以写这样的东西:
<expression> :: == <rule> | <rule> <expression> | <rule> " followed by " <expression>
<rule> :: == <val> | <qty> <val>
<qty> :: == "literal" | "one" | "one of" | "one or more of" | "zero or more of"
<val> :: == "a" | "b" | "c" | "d" | ... | "Z" |
Run Code Online (Sandbox Code Playgroud)
这远远不是一个完美的描述.有关更多信息,请查看正则表达式语言的此BNF.然后你可以看看lexing并解析表达式.
如果你这样做,你可能会更接近自然语言 /英语版本的正则表达式.
我可以看到这样的工具很有用,但正如之前所说,主要针对初学者.这种方法的主要限制在于您必须编写的代码量才能将语言转换为正则表达式(和/或反之亦然).另一方面,我认为双向翻译工具实际上更理想并且看到更多用途.能够使用正则表达式并将其转换为英语可能对发现错误更有帮助.
当然,拾取正则表达式不需要太长时间,因为语法通常是简洁的,并且大多数含义都是非常自我解释的,至少如果你使用| 或|| 和OR
你的语言一样,你认为*乘以0-N,+加0-N.
虽然有时我不介意输入"找到一个或多个'a'后跟三位数或'b'然后'c'"
对于试图编写易于理解和维护的正则表达式的开发人员来说,我想知道这种方法是否会提供re.VERBOSE
尚未提供的任何内容。
对于初学者来说,你的想法可能有一定的吸引力。然而,在走这条路之前,您可能会尝试使用捕获组、锚点、前瞻断言等来模拟更复杂的正则表达式的声明性语法。一个挑战是您最终可能会得到一种与正则表达式语言本身一样难以记住的声明性语法。
您可能还会考虑表达事物的其他方式。例如,我首先想到的是使用名称简短、易于记住的函数来表达正则表达式。例如:
from refunc import *
pattern = Compile(
'a',
Capture(
Choices('b', 'c'),
N_of( 'd', 1, Infin() ),
N_of( 'e', 0, Infin() ),
),
Look_ahead('foo'),
)
Run Code Online (Sandbox Code Playgroud)
但当我看到它的实际效果时,我觉得很痛苦。正则表达式的许多方面都非常直观——例如,+
表示“一个或多个”。一种选择是混合方法,允许用户将正则表达式中已经很简单的部分与更深奥的位的功能混合在一起。
pattern = Compile(
'a',
Capture(
'[bc]',
'd+',
'e*',
),
Look_ahead('foo'),
)
Run Code Online (Sandbox Code Playgroud)
我想补充一点,根据我的经验,正则表达式是关于学习思维过程的。熟悉语法是比较容易的部分。