我需要将Python中的表达式与仅匹配偶数个字母出现的正则表达式进行匹配。例如:
AAA # no match AA # match fsfaAAasdf # match sAfA # match sdAAewAsA # match AeAiA # no match
偶数的As应该匹配。
答案 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
这应该是所有有经验的程序员可以立即理解的,而像“(?
简单就是更好。