我came across不包含101的正则表达式如下:
0 * 1 * 0 * +(1 + 00 + 000) * +(0 < SUP> + 1 + 0 + ) *
我无法理解作者如何提出这个正则表达式。所以我只想到了不包含101的字符串:
01000100
我似乎上面的正则表达式不匹配上面的字符串。但我不确定。所以尝试转换为等效的pcre正则表达式on regex101.com,但也失败了(因为可以看出我的正则表达式甚至不匹配包含单个1的字符串。
我的翻译有什么问题?上面的正则表达式确实正确吗?如果不是正确的正则表达式?
答案 0 :(得分:3)
这是一个较短的表达式^0*(1|00+)*0*$
https://www.regex101.com/r/gG3wP5/1
说明:
(1|00+)*
只要在组中出现零,我们就可以混合使用零和^0*...0*$
我们可以在前缀/后缀原始正则表达式的直接翻译就像
^(0*1*0*|(1|00|000)*|(0+1+0+)*)$
<强>更新强>
这似乎是上述正则表达式的人工复杂版本:
(1|00|000)*
与(1|00+)*
相同
0
,01..
和..10
0*1*0*
与101
内的字符串不匹配,但匹配0
和部分01..
以及..10
01..
和..10
0
和1
01001..
内部混合,例如..10010
或(0+1+0+)*
10010
匹配其余一些案例,但仍有一些无效的有效字符串
username=raw_input("Please give me a username")
def gebruikersnaam():
username(len)
if len(username) >= 8:
print "Well done"
elif len(username) <= 1:
print "More characters please" #Please try again, input your username again.
是所有情况都不匹配的最短字符串。因此,这个解决方案过于复杂而且不完整。
答案 1 :(得分:1)
阅读regex101右侧选项卡中的说明,它告诉你你的正则表达式做什么(我认为你误解了列表运算符的作用),在列表运算符([
)内,其他字符如{{ 1}}不再是元字符,因此表达式(
将等同于[(0*1*0*)[1(00)(000)]
,这意味着它匹配[01()*[]
正则表达式0 or 1 or ( or ) or [
的正确翻译
将如下:
0∗1∗0∗+(1+00+000)∗+(0+1+0+)∗
你的正则表达式^((?:0*1*0*)|(?:1|00|000)*|(?:0+1+0+)*)$
做了什么:
[(0*1*0*)[1(00)(000)]*(0+1+0+)*]
[(0*1*0*)[1(00)(000)]* -> matches any of characters 0,(,),*,[ zero or more times followed by
(0+1+0+)* --> matches the pattern 0+1+0+ 0 or more times followed by
所以你的表达式相当于
] --> matches the character ]
这不是匹配不包含[([)01](0+1+0+)*]
的字符串的正则表达式
答案 2 :(得分:0)
0 * 1 *((00 + 000)* 1 *)*(ε+ 0)
我认为这个表达涵盖了所有情况,因为 -
除1之外的任何数字都可以分成组成2和3,即任何数字n = 2 * i + 3 * j。因此,除了一个0.Hence之外,在2个连续的1之间可以有任意数量的0,因此无法获得101.
ε+ 0。
答案 3 :(得分:0)
不包含101作为子字符串的语言的RE也可以写为(0*1*00)*.0*.1*.0*
这可能是我使用的较小的一个。尽量利用这一点。