匹配交替字符的字符串

3

我想匹配每个第二个字符相同的字符串,例如 'abababababab'。

我尝试过这个正则表达式:'''(([a-z])[^/2])*'''

输出应该返回完整的字符串,例如 'abababababab'

4个回答

3

实际上,在一个状态数与字母表大小成多项式关系的真正正则表达式中,这是不可能做到的,因为该表达式不是Chomsky 0级文法。


然而,Python的正则表达式实际上不是真正的正则表达式,并且可以处理比那更复杂的语法。特别地,您可以将您的文法放在以下位置。

(..)\1*

(..)是由两个字符组成的序列。\1*匹配一对确切的字符,可以重复任意次数(可能为空)。


我的理解是您想要每隔一个字符相等(ababab可以匹配,但abcbdb无法匹配)。如果您只需要第二个、第四个...字符相等,您可以使用类似的方法。

.(.)(.\1)*

2
你可以匹配第一个[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 后跟对第一组引用的字符
  • $ 匹配字符串的结束位置

正则表达式演示

最初的回答:
这个正则表达式用于匹配以小写字母开头的单词,并且该单词中的字符都是小写字母且与第一个字符相同。例如,它将匹配 "abb" 和 "add",但不会匹配 "aab" 或 "abbc"。

0

虽然不是正则表达式的答案,但你可以像这样做:

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

0

这是一个有点复杂的表达式,也许我们可以从以下开始:

^(?=^[a-z]([a-z]))([a-z]\1)+$

如果我理解问题正确的话。

演示


我们如何匹配您示例中的第三个和第五个字符串,例如如果字符串类似于abababa。 - Pat Yas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接