4

我正在尝试创建一个正则表达式来匹配字符串中指定次数的字符。该字符不必在它最后一次出现后立即出现,因此正则表达式必须在它出现的任何地方匹配该字符的次数,而该次数不超过给定的次数。

此外,这个正则表达式必须是重叠的,这意味着它必须找到包含指定字符的所有子字符串,它被指定的次数;它必须在字符串中尽可能多地执行此操作。

这是我的尝试,这只是蛮力的,并找到几乎所有可能包含该字符的字符串:

import re
c = raw_input()
a = re.compile(r'(?=(.*{0}.*?))(?=(.*{1}.*))(?=(.*?{2}.*))'.format(c, c, c))
print [ s for s in a.findall(raw_input()) ]

这样做的原因是它试图找到所有这些,但有时找不到所有东西:

python
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import string_regex
1
10101
[('10101', '10101', '10101'), ('0101', '0101', '0101'), ('101', '101', '101'), ('01', '01', '01'), ('1', '1', '1')]

它没有找到它应该找到 2 次的字符串 '10' 我需要帮助才能使正则表达式匹配我想要的不是一切

4

2 回答 2

5

尝试使用这种模式(0 到 2 次之间的 10 次)

^(([^1]+|1+(?!0))*10){0,2}([^1]+|1+(?!0))*$

您可以轻松地将其调整为0到 3 次:

^(([^r]+|r+(?!abbit))*rabbit){0,3}([^r]+|r+(?!abbit))*$
于 2013-06-10T20:54:40.273 回答
0

这是一个列表推导式,1假设字符串由字符01. 要允许任何字符,请替换[^1]每个0.

[prefix + suffix[:n] 
    for prefix, suffix in re.findall(r'(?=((?:0*1){2})(0*))', '010100110')
        for n in xrange(len(suffix) + 1)]

输出:

['0101', '01010', '010100', '101', '1010', '10100', '01001', '1001', 
 '0011', '00110', '011', '0110', '11', '110']

在前瞻中使用捕获组会findall产生重叠匹配,但每个匹配仍然从不同的位置开始。在这里,我使用字符串切片来生成从同一位置开始的不同子字符串。

于 2013-06-11T07:11:57.577 回答