python奇数的表达式_我们可以用正则表达式来检查每种类型的字符是否有奇数吗?...

正则表达式的限制不超过DFA;事实上,它们是等价的。(带有反向引用的Perl风格的“regex”更强大,因此它们根本不是“常规的”

如果字符串只包含as,我们可以轻松地编写regex:a(aa)*

如果其他字母也可能出现在中间,我们仍然可以忽略这些字符:

^{pr2}$

因为regex相当于DFA,所以每个字母都有一个DFA。其实很简单:[^a] _ [^a] _

/ \ / \

| v a | v

-> (0) -> ((1))

< -

a

State(0)是开始状态(“偶数个a出现”),State((1))是唯一接受的状态(“奇数个as可见”)。如果我们看到一个a,我们将进入另一个状态;对于任何其他字符,我们将保持相同的状态。在

现在DFA的好处是它们是可组合的。特别是在交叉口处是封闭的。这意味着,如果我们有一个能够识别语言“包含奇数个as”的DFA和识别语言“包含奇数bs的字符串”的DFA,我们可以将它们组合成一个能识别这两种语言交集的DFA,也就是说,“包含奇数a和奇数b的字符串”。在

我不想详细介绍这个算法,但是this question有一些很好的答案。得到的DFA将有四种状态:“偶数个as可见,偶数bs已见”,“偶数as可见,奇数bs可见”,等等。在

而且因为dfa等同于regex,所以也存在一个与这些字符串精确匹配的regex。同样,我不会详细介绍算法,但是here is an article可以很好地解释它。为了方便起见,它还附带了一些Python 3代码来完成这些肮脏的工作:>>> from fsm import fsm

>>> a = fsm(

alphabet = {'a', 'b'},

states = {0, 1, 2, 3},

initial = 0,

finals = {3},

map = {

0: {'a': 1, 'b': 2},

1: {'a': 0, 'b': 3},

2: {'a': 3, 'b': 0},

3: {'a': 2, 'b': 1}

}

)

>>> str(a.lego())

'a*(ab|b(ba*b)*(a|ba+b))((a|ba+b)(ba*b)*(a|ba+b)|ba*b)*'

库中可能有一个bug,或者我用错了,因为开头的a*不可能是正确的。但是你得到了一个想法:虽然理论上是可能的,你真的不想为此使用regex!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值