正则表达式匹配?

时间:2011-09-26 20:58:04

标签: python regex

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

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

由于有一个管道'|',我将它分成2个正则表达式,

^1?$

为此,它应验证1或值。我是对的吗?

^(11+?)\1+$

对于上述正则表达式,它将验证值1111.第一对11基于(11+?),第二对11基于\ 1。

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

4 个答案:

答案 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+)$/

请注意,只有一个开始和结束使用