我正在尝试确定提供的字符串是否包含重复两次的字符。以下是我正在使用的正则表达式:
([a-z])\1(?!\1)
但是,当针对以下字符串进行测试时,下面的两个字符串都与模式匹配(尽管我使用过(?!\ 1):
>>> re.findall(r'.*([a-z])\1(?!\1)', 'abcdeefg')
['e']
>>> re.findall(r'.*([a-z])\1(?!\1)', 'abcdeeefg')
['e']
不确定上述模式有什么问题
答案 0 :(得分:1)
我怀疑单独使用python正则表达式无法满足您的需求。为了确保字符重复两次,需要在断言后面进行否定查看,并且此类断言不能包含组引用。
最简单的方法是寻找所有重复,然后检查它们的长度。
def double_repeats(txt):
import itertools
# find possible repeats
candidates = set(re.findall(r'([a-z])\1', txt))
# now find the actual repeated blocks
repeats = itertools.chain(*[re.findall(r"({0}{0}+)".format(c), txt) for c in candidates])
# return just the blocks of length 2
return [x for x in repeats if len(x) == 2]
然后:
>>> double_repeats("abbbcbbdddeffgggg")
['ff', 'bb']
答案 1 :(得分:0)
您可以使用正则表达式替代操作员技巧。
>>> def guess(s):
out = re.findall(r'([a-z])\1{2,}|([a-z])\2', s)
if out and out[0][1]:
return True
return False
>>> k = ['abcdeefg', 'abcdeeefg']
>>> [guess(i) for i in k]
[True, False]
>>>
([a-z])\1{2,}
匹配所有重复的字符,其最小为3个字符的最大值。
|
或
([a-z])\2
恰好匹配剩余字符串中的两个重复字符,因为所有相同的连续字符都与第一个字符匹配。
或
>>> def guess(s):
out = re.findall(r'([a-z])\1{2,}|([a-z])\2', s)
if out and out[0][1]:
return out[0][1]
return False
>>> k = '23413e4abcee'
>>> k.count(guess(k)) == 2
False
>>> k = '234134abcee'
>>> k.count(guess(k)) == 2
True
>>>
如果你想获得像其他答案一样的输出,那么你去吧,
>>> def guess(s):
out = re.findall(r'([a-z])\1{2,}|([a-z])\2', s)
if out:
return [y+y for x,y in out if y]
return []
>>> guess("abbbcbbdddeffgggg")
['bb', 'ff']
>>>
答案 2 :(得分:-1)
我发现这是最好的方法。