我需要在Python中使用正则表达式匹配仅匹配偶数字母出现次数的表达式。例如:
AAA #不匹配 AA #匹配 fsfaAAasdf #匹配 sAfA #匹配 sdAAewAsA #匹配 AeAiA #不匹配
应该匹配偶数个A。
尝试使用这个正则表达式:
^[^A]*((AA)+[^A]*)*$
如果A
不需要连续:
^[^A]*(A[^A]*A[^A]*)*$
len(re.findall("A", "AbcAbcAbcA")) % 2 == 0
这应该对所有有经验的程序员来说都是即刻可懂的,而像“(?
简单就是更好。
”这样的模式则不如此直观易懂。这个搜索会查找一个包含奇数个A的块。如果找到了,那么这个字符串对你来说是不好的:
(?<!A)A(AA)*(?!A)
if re.search("(?<!A)A(AA)*(?!A)", "AeAAi"):
print "fail"
'A*'
表示匹配任意数量的 A
,甚至可以是 0。
以下是如何匹配一个具有偶数个大写或小写字母 a 的字符串:
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 )
[...]
a*
正则表达式会匹配像 bb
这样的字符串。有时候匹配 0 个 a
并不是非常明显 :-) - Ross Rogers'*' 表示 0 或多个出现次数 使用 'AA' 应该可以解决问题。
问题是你是否想匹配 'AAA'。在这种情况下,你需要做一些像这样的事情:
r = re.compile('(^|[^A])(AA)+(?!A)',)
r.search(p)
这对于匹配偶数个“ A”(仅限偶数)将起作用。
现在,如果您想匹配“连续字母中有任何偶数个”,则可以使用以下方法:
re.compile(r'(.)\1')
然而,这并不排除“奇怪”的情况。但从你的问题中并不清楚你是否真的想要那样做。
更新: 这对于你的测试用例有效:
re.compile('^([^A]*)AA([^A]|AA)*$')
/A*/
匹配空字符串。A* 表示匹配零个或多个 "A"。
对于偶数个 "A",尝试使用:(AA)+
使用正则表达式无法任意计数。例如,确保匹配括号。要进行计数,需要“记忆”,这需要像下推自动机一样强大的东西,尽管在这种情况下,您可以使用@Gumbo提供的正则表达式。
使用finditer
是一般情况下最好的解决方法。
foo
应该匹配还是不匹配? - Mark Byers