Python正则表达式可以多次匹配字符

时间:2013-06-10 20:48:16

标签: python regex

我正在尝试创建一个正则表达式,以便在字符串中匹配指定次数的字符。该字符不必在它最后一次出现之后发生,因此正则表达式必须匹配字符所出现的任何位置,而该字符数不超过给定的数字。

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

这是我的尝试,这个只是暴力强制它的方式,并找到几乎所有可能包含该字符的字符串:

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' 我需要帮助才能使正则表达式匹配我想要的东西

2 个答案:

答案 0 :(得分:1)

尝试使用这种模式(10次或0次之间)

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

您可以轻松地将其适应 rabbit 0至3次:

^(([^r]+|r+(?=abbit))*rabbit){0,3}([^r]+|r+(?=abbit))*$

答案 1 :(得分: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给出重叠匹配,但每个匹配仍然从不同的位置开始。在这里,我使用字符串切片来生成从相同位置开始的不同子串。