【发布时间】:2011-01-04 05:10:01
【问题描述】:
我正在读一本书,它们提供了一个如何将给定字符串与正则表达式匹配的示例。 这是他们的例子:
b*(abb*)*(a|∊) - Strings of a's and b's with no consecutive a's.
现在我已经尝试将它转换为 python,如下所示:
>> p = re.compile(r'b*(abb*)*(a|)') # OR
>> p = re.compile(r'b*(abb*)*(a|\b)')
# BUT it still doesn't work
>>> p.match('aa')
<_sre.SRE_Match object at 0x7fd9ad028c68>
我的问题有两个:
- python 中的 epsilon 等效项是什么才能使上述示例正常工作?
- 谁能向我解释一下为什么理论上或标准的正则表达式在 python 中不起作用?可能与最长匹配与最短匹配有关吗?
澄清:对于询问标准正则表达式是什么的人 - 它是形式语言理论标准:http://en.wikipedia.org/wiki/Regular_expression#Formal_language_theory
【问题讨论】:
-
示例的注释是错误的......正则表达式不仅匹配没有连续 a 的 a 和 b 的字符串。我会用 b+ btw 替换 bb*。
-
@S.Lott:一个叫Kleene的家伙;见en.wikipedia.org/wiki/Stephen_Kleene ...“他还发明了正则表达式”
-
Epsilon 是“标准”Kleene reg exps 中的空字符串。正则表达式早在进入编程语言之前就来自计算理论(数学)......
-
@S.Lott:尝试阅读 OP 写的内容:“做正则表达式的理论或标准方法”。当然不是具体的实现。他在询问为什么他的 Python 解释(其中一个是正确的(只是省略了 epsilon))与他在书中看到的不符。这就是我们应该帮助的。答案是该表达式还匹配一个零长度字符串,它需要添加 $(或者,更好的 \Z)才能获得所需的效果。关于三角学书中的公式和尝试用 Python 实现它的问题可以吗?
-
@S.Lott。并非所有标准都来自标准编写组织。此外,并非所有标准事物都是软件工程意义上的标准。哪个标准组织决定莱布尼茨符号将成为“标准微积分符号”?任何学习过计算理论课程的人都应该知道做正则表达式的“正常”方式是什么:使用 Kleene 表示法。此外,Kleene 早于标准组织的概念。