我想匹配每个第二个字符相同的字符串,例如 'abababababab'。
我尝试过这个正则表达式:'''(([a-z])[^/2])*'''
输出应该返回完整的字符串,例如 'abababababab'
实际上,在一个状态数与字母表大小成多项式关系的真正正则表达式中,这是不可能做到的,因为该表达式不是Chomsky 0级文法。
然而,Python的正则表达式实际上不是真正的正则表达式,并且可以处理比那更复杂的语法。特别地,您可以将您的文法放在以下位置。
(..)\1*
(..)
是由两个字符组成的序列。\1*
匹配一对确切的字符,可以重复任意次数(可能为空)。
我的理解是您想要每隔一个字符相等(ababab可以匹配,但abcbdb无法匹配)。如果您只需要第二个、第四个...字符相等,您可以使用类似的方法。
.(.)(.\1)*
[a-z]
,然后在一个组中捕获([a-z])
。然后重复0+次,再次匹配a-z和对组1的反向引用,以保持每个第二个字符相同。"最初的回答"^[a-z]([a-z])(?:[a-z]\1)*$
解释
^
匹配字符串的开始位置[a-z]([a-z])
匹配 a-z 的字符并在第一组中捕获匹配的 a-z 字符)(?:[a-z]\1)*
重复零次或多次,匹配 a-z 后跟对第一组引用的字符$
匹配字符串的结束位置虽然不是正则表达式的答案,但你可以像这样做:
def all_same(string):
return all(c == string[1] for c in string[1::2])
string = 'abababababab'
print('All the same {}'.format(all_same(string)))
string = 'ababacababab'
print('All the same {}'.format(all_same(string)))
string[1::2]
表示从第二个字符 (1
) 开始,每隔一个字符取出一个(2
的部分)。
这将返回:
All the same True
All the same False