Regex 偶数为1的位字符串的正则表达式

Regex 偶数为1的位字符串的正则表达式,regex,compiler-construction,grammar,Regex,Compiler Construction,Grammar,设L={w in(0+1)*|w具有偶数个1s},即L是具有偶数个1s的所有位字符串的集合。下面哪一个正则表达式表示L A) (0*10*1)* B) 0*(10*10*)* C) 0*(10*1)*0* D) 0*1(10*1)*10* 根据我的说法,选项D永远都不正确,因为它不代表零1s的位字符串。但是其他的选择呢?我们关心的是1的数量(偶数与否),而不是零的数量 那么哪个选项是正确的,为什么呢?A如果为false。它不会与0110匹配(或仅与任何零匹配的非空字符串) B代表OK。我不会费心

L={w in(0+1)*|w具有偶数个1s}
,即L是具有偶数个1s的所有位字符串的集合。下面哪一个正则表达式表示L

A) (0*10*1)*
B) 0*(10*10*)*
C) 0*(10*1)*0*
D) 0*1(10*1)*10*

根据我的说法,选项
D
永远都不正确,因为它不代表零1s的位字符串。但是其他的选择呢?我们关心的是1的数量(偶数与否),而不是零的数量


那么哪个选项是正确的,为什么呢?

A如果为false。它不会与0110匹配(或仅与任何零匹配的非空字符串)

B代表OK。我不会费心在这里证明它,因为页边距太小了

C不匹配010101010(中间为零,不匹配)< /P> 正如你所说的,D不能与00或任何其他数字相匹配,没有人


因此,只有B

寻找应该匹配但不匹配的示例<代码>0、
11011
1100
都应该匹配,但是这四个代码中的一个都失败了C是不正确的,因为它不允许在一个组的第二个1和下一个组的第一个1之间有任何0。

快速python脚本实际上消除了所有可能性:

import re

a = re.compile("(0*10*1)*")
b = re.compile("0*(10*10*)*")
c = re.compile("0*(10*1)* 0*")
d = re.compile("0*1(10*1)* 10*")

candidates = [('a',a),('b',b),('c',c),('d',d)]
tests = ['0110', '1100', '0011', '11011']
for test in tests:
    for candidate in candidates:
        if not candidate[1].match(test):
            candidates.remove(candidate)
            print "removed %s because it failed on %s" % (candidate[0], test)

ntests = ['1', '10', '01', '010', '10101']
for test in ntests:
    for candidate in candidates:
        if candidate[1].match(test):
            candidates.remove(candidate)
            print "removed %s because it matched on %s" % (candidate[0], test)
输出:

  • 已删除c,因为它在0110失败
  • 已删除d,因为它在0110失败
  • 已删除,因为它在1上匹配
  • 删除了b,因为它与10匹配

    • 要解决这样的问题,你应该

    • 为所有“不正确”的正则表达式提供反例模式。这将是
      L
      中不匹配的字符串,或者是
      L
      中匹配的字符串
    • 要证明剩余的“正确”模式,您应该回答两个问题:

      • 是否每个与模式匹配的字符串都属于
        L
        ?这可以通过设计每个匹配字符串应该满足的属性来实现——例如,某些字符的出现次数
      • L
        中的每个字符串是否都与regexp匹配?这是通过将
        L
        划分为易于分析的子类来实现的,并显示每个子类都以自己的方式匹配模式

    • (由于[家庭作业]没有具体答案。)

      检查模式
      B

      ^0*(10*10*)*$
      
      ^          # match beginning of string
      0*         # match zero or more '0'
      (          # start group 1
       10*       # match '1' followed by zero or more '0'
       10*       # match '1' followed by zero or more '0'
      )*         # end group 1 - match zero or more times
      $          # end of string
      

      很明显,此模式将只匹配具有0,2,4<代码>1。

      这个答案最适合这种语言

      (0*10*10*)
      

      仅仅因为你没有证明B是错误的,并不意味着你已经证明了B。不过,很好的努力,只是错误的逻辑。哎呀,我的错。当锚定表达式(将每个表达式放在a^和a$之间)时,唯一幸存下来的是B。当然,您仍然需要证明它……我认为正则表达式中的空格不应该算数。您应该在忽略空白的情况下重新运行它;这些是语言匹配正则表达式。因此,请记住在测试时锚定它们。字符串“
      000
      ”有偶数个1(零个1),但正则表达式与之不匹配。(我想我应该说正则表达式A与
      0+
      不匹配,因为它得到的是空字符串。)我指出这一点是因为这是一个重要的角案,还没有被提起,我之所以在这里这样做,是因为我认为不值得给出自己的答案。啊。好的,明白了。。。更新!谢谢你能告诉我一些细节吗?意见通常是不够的。您的表达与011011不匹配。它应该是:(0*10*10*)*,并不比0*(10*10*)好*