正则表达式匹配偶数个字母

时间:2010-01-11 21:46:19

标签: python regex

我需要将Python中的表达式与仅匹配偶数个字母出现的正则表达式进行匹配。例如:

AAA        # no match
AA         # match
fsfaAAasdf # match
sAfA       # match
sdAAewAsA  # match
AeAiA      # no match

偶数的As应该匹配。

8 个答案:

答案 0 :(得分:16)

试试这个正则表达式:

^[^A]*((AA)+[^A]*)*$

如果A不需要连续:

^[^A]*(A[^A]*A[^A]*)*$

答案 1 :(得分:3)

这将搜索具有奇数个A的块。如果你找到一个,那么这个字符串对你不利:

(?<!A)A(AA)*(?!A)

如果我理解正确,Python代码应如下所示:

if re.search("(?<!A)A(AA)*(?!A)", "AeAAi"):
   print "fail"

答案 2 :(得分:2)

'A*'表示匹配任意数量的A。甚至是0。

以下是如何匹配字符串与偶数个,大写或小写:

re.compile(r'''
    ^
    [^a]*
    (
        (
            a[^a]*
        ){2}
    # if there must be at least 2 (not just 0), change the
    # '*' on the following line to '+'
    )* 
    $
    ''',re.IGNORECASE|re.VERBOSE)

您可能正在使用a作为示例。如果您要匹配a以外的特定字符,请将a替换为%s,然后插入

[...]
$
'''%( other_char, other_char, other_char )
[...]

答案 3 :(得分:1)

'*'表示0或更多次出现 “AA”应该可以解决问题。

问题是你是否希望这个东西与'AAA'相匹配。在这种情况下,您必须执行以下操作:

r = re.compile('(^|[^A])(AA)+(?!A)',)
r.search(p)

这对于匹配甚至(甚至是偶数)'A'的数字都有用。

现在如果你想匹配'如果有任何偶数的后续字母',这就可以了:

re.compile(r'(.)\1')

然而,这并不排除'奇数'出现。但是你的问题并不清楚你是否真的想要那个。

更新: 这适用于测试用例:

re.compile('^([^A]*)AA([^A]|AA)*$')

答案 4 :(得分:0)

首先,请注意/A*/匹配空字符串。

其次,有些事情你不能用正则表达式做。如果你只是走过字符串并计算你正在寻找的所有出现的信件,这将会容易得多。

答案 5 :(得分:0)

A *表示匹配“A”零次或多次。

对于偶数“A”,请尝试:(AA)+

答案 6 :(得分:0)

不可能使用正则表达式计算任意。例如,确保您具有匹配的括号。要计算你需要'记忆',它需要至少与pushdown automaton一样强的东西,尽管在这种情况下你可以使用@Gumbo提供的正则表达式。

使用finditer的建议是一般情况下的最佳解决方法。

答案 7 :(得分:0)

为什么如此努力地想出一个难以阅读的模式呢?只需搜索所有出现的模式并计算您找到的数量。

len(re.findall("A", "AbcAbcAbcA")) % 2 == 0

这应该是所有有经验的程序员可以立即理解的,而像“(?

简单就是更好。