我在Python中有以下正则表达式,
^1?$|^(11+?)\1+$
由于有一个管道'|',我将它分成2个正则表达式,
^1?$
为此,它应验证1或空值。我是对的吗?
^(11+?)\1+$
对于上述正则表达式,它将验证值1111.第一对11基于(11+?),第二对11基于\ 1。
当我尝试在Python中执行它时,它仅对1111返回true,而不是11或空值。我错了吗?
答案 0 :(得分:2)
Ted写道:
为此,它应验证1或空值。我是对的吗?
是的,这是正确的。
Ted写道:
当我尝试在Python中执行它时,它仅对1111返回true,而不是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
未匹配,因为{1}}在第1组(11
)中匹配,然后应至少重复一次((11+?)
),情况并非如此(不再重复)。
答案 1 :(得分:0)
+
之后有\1
表示贪婪1或更多。
您是否尝试将1
与1到4次匹配?
使用:
r'^(1+){1,4}$'
最简单的方法是使用其中一款优秀的正则表达式工具。以下是my favorite.使用相同的网站,您可以看到your regex does not work的原因。
这是一个explains regex's。
的网站答案 2 :(得分:0)
如果您希望第二个表达式匹配“11”,“1111”,“111111”等,请使用:
^(1+)\1$
答案 3 :(得分:0)
我认为你需要更多的括号来定义|
所指的内容。我会写这样的正则表达式:
/^(1?|^(11+?)\2+)$/
请注意,只有一个开始和结束使用