我有以下在Python正则表达式,正则表达式匹配
^1?$|^(11+?)\1+$
由于存在管“|”,我将其分割为2的正则表达式,
^1?$
对于这一点,应该验证1或空值。我对么?
^(11+?)\1+$
对于上述正则表达式,这将验证的1111值的第一对11基于(11+α)和所述第二对11是由于\ 1。
当我尝试在Python中执行它时,它仅对1111返回true,但不是11或空值。我在哪里错了吗?
我有以下在Python正则表达式,正则表达式匹配
^1?$|^(11+?)\1+$
由于存在管“|”,我将其分割为2的正则表达式,
^1?$
对于这一点,应该验证1或空值。我对么?
^(11+?)\1+$
对于上述正则表达式,这将验证的1111值的第一对11基于(11+α)和所述第二对11是由于\ 1。
当我尝试在Python中执行它时,它仅对1111返回true,但不是11或空值。我在哪里错了吗?
特德说:
为此,应验证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+
) ,情况并非如此(不重复)。
你有一个+
后\1
意味着1贪婪或更多。
你想要匹配1
1到4次吗?
用途:
r'^(1+){1,4}$'
最简单的方法是使用的伟大正则表达式的工具之一在那里。这里是my favorite.在同一个网站,你可以看到为什么your regex does not work。
这是一个网站,explains regex's。
在'\ 1'之后有或没有'+',输入'“11”'仍然不匹配,空字符串_will_匹配。换句话说:就我所知,“+”不是问题所在。除非我误解事情...... –
@Bart Kiers:那么OP有没有想要做什么;-)我把它解释为他想分割一个正则表达式,并且第二个匹配与1,11 ,111或1111.他的正则表达式只匹配1111。 – dawg
Err,no,'“1”'也匹配。我同意你的看法,但有点不清楚! :) –
如果您希望第二个表达式匹配'11','1111','111111'等用途:
^(1+)\1$
我认为你需要更多的括号定义|
指的是什么。我会写这样的正则表达式:
/^(1?|^(11+?)\2+)$/
音符只有一个起点和终点使用
不,它与'^ 1?$ | ^(11 +?)\ 1 + $'完全相同 –
嗯,黄金VS-合数的一元表示法通过正则表达式? – tchrist
是的,试图为它写一个正则表达式。你很好。 :) – Ted
@ tchrist,很好地发现!当我看到它匹配'111111111'(9'1')后,我有点难过,然后它发生在我身上,'\ 1 +'匹配了3次3'1'。 :) –