2011-09-26 345 views
4

我有以下在Python正则表达式,正则表达式匹配

^1?$|^(11+?)\1+$ 

由于存在管“|”,我将其分割为2的正则表达式,

^1?$ 

对于这一点,应该验证1或值。我对么?

^(11+?)\1+$ 

对于上述正则表达式,这将验证的1111值的第一对11基于(11+α)和所述第二对11是由于\ 1。

当我尝试在Python中执行它时,它仅对1111返回true,但不是11或空值。我在哪里错了吗?

+3

嗯,黄金VS-合数的一元表示法通过正则表达式? – tchrist

+0

是的,试图为它写一个正则表达式。你很好。 :) – Ted

+0

@ tchrist,很好地发现!当我看到它匹配'111111111'(9'1')后,我有点难过,然后它发生在我身上,'\ 1 +'匹配了3次3'1'。 :) –

回答

2

特德说:

为此,应验证1或空值。我对么?

是的,这是正确的。

特德说:

当我尝试在Python执行它,它返回true只为1111而不是11或空值。我在哪里错了吗?

空字符串确实得到匹配。下面的代码片断:

#!/usr/bin/env python 
import re 

for n in xrange(0, 51): 
    ones = '1' * n 
    matches = re.match(r'^1?$|^(11+?)\1+$', ones) 
    if matches: 
    div1 = n if matches.group(1) is None else len(matches.group(1)) 
    div2 = 0 if div1 is 0 else len(ones)/div1 
    print "[{0:2}]:{1:2} * {2:2} = '{3}'".format(n, div1, div2, ones) 

将打印:

[ 0]: 0 * 0 = '' 
[ 1]: 1 * 1 = '1' 
[ 4]: 2 * 2 = '1111' 
[ 6]: 2 * 3 = '111111' 
[ 8]: 2 * 4 = '11111111' 
[ 9]: 3 * 3 = '111111111' 
[10]: 2 * 5 = '1111111111' 
[12]: 2 * 6 = '111111111111' 
[14]: 2 * 7 = '11111111111111' 
[15]: 3 * 5 = '111111111111111' 
[16]: 2 * 8 = '1111111111111111' 
[18]: 2 * 9 = '111111111111111111' 
[20]: 2 * 10 = '11111111111111111111' 
[21]: 3 * 7 = '111111111111111111111' 
[22]: 2 * 11 = '1111111111111111111111' 
[24]: 2 * 12 = '111111111111111111111111' 
[25]: 5 * 5 = '1111111111111111111111111' 
[26]: 2 * 13 = '11111111111111111111111111' 
[27]: 3 * 9 = '111111111111111111111111111' 
[28]: 2 * 14 = '1111111111111111111111111111' 
[30]: 2 * 15 = '111111111111111111111111111111' 
[32]: 2 * 16 = '11111111111111111111111111111111' 
[33]: 3 * 11 = '111111111111111111111111111111111' 
[34]: 2 * 17 = '1111111111111111111111111111111111' 
[35]: 5 * 7 = '11111111111111111111111111111111111' 
[36]: 2 * 18 = '111111111111111111111111111111111111' 
[38]: 2 * 19 = '11111111111111111111111111111111111111' 
[39]: 3 * 13 = '111111111111111111111111111111111111111' 
[40]: 2 * 20 = '1111111111111111111111111111111111111111' 
[42]: 2 * 21 = '111111111111111111111111111111111111111111' 
[44]: 2 * 22 = '11111111111111111111111111111111111111111111' 
[45]: 3 * 15 = '111111111111111111111111111111111111111111111' 
[46]: 2 * 23 = '1111111111111111111111111111111111111111111111' 
[48]: 2 * 24 = '111111111111111111111111111111111111111111111111' 
[49]: 7 * 7 = '1111111111111111111111111111111111111111111111111' 
[50]: 2 * 25 = '11111111111111111111111111111111111111111111111111' 

和输入11因为11在组1((11+?))匹配不匹配,这然后应重复至少一次(\1+) ,情况并非如此(不重复)。

+0

对于第一组正则表达式,^ 1?$,空值匹配,但为什么不匹配1或11?由于1适合^ 1和11中的匹配,适合1?中的匹配。 – Ted

+0

@Ted,空字符串和'“1”'匹配。看到我的(稍微)编辑答案。 –

+0

谢谢!我误解了'(^ 1?$)'。我认为这意味着1或11由于??元字符(零或一)。 – Ted

0

你有一个+\1意味着1贪婪或更多。

你想要匹配1 1到4次吗?

用途:

r'^(1+){1,4}$' 

最简单的方法是使用的伟大正则表达式的工具之一在那里。这里是my favorite.在同一个网站,你可以看到为什么your regex does not work

这是一个网站,explains regex's

+0

在'\ 1'之后有或没有'+',输入'“11”'仍然不匹配,空字符串_will_匹配。换句话说:就我所知,“+”不是问题所在。除非我误解事情...... –

+0

@Bart Kiers:那么OP有没有想要做什么;-)我把它解释为他想分割一个正则表达式,并且第二个匹配与1,11 ,111或1111.他的正则表达式只匹配1111。 – dawg

+0

Err,no,'“1”'也匹配。我同意你的看法,但有点不清楚! :) –

0

如果您希望第二个表达式匹配'11','1111','111111'等用途:

^(1+)\1$ 
0

我认为你需要更多的括号定义|指的是什么。我会写这样的正则表达式:

/^(1?|^(11+?)\2+)$/ 

音符只有一个起点和终点使用

+0

不,它与'^ 1?$ | ^(11 +?)\ 1 + $'完全相同 –