Python 正则匹配字母序列

0 投票
4 回答
1796 浏览
提问于 2025-04-16 19:20

我想写一个正则表达式,能够匹配像“AGGH”、“TIIK”、“6^^?”这样的字符串,但不匹配“AGGA”、“ABCD”。简单来说,我想要关注字母的排列方式。有没有办法可以要求某个字符是我之前有过的,或者是我之前没有的?

4 个回答

0

为什么不直接使用子字符串搜索呢?

if "AGGH" in myStr:
    print "Success!"
1

有一种方法可以用正则表达式来实现:

import re
strs=("AGGH", "TIIK", "6^^?" ,"AGGA", "ABCD")
p = re.compile('^(?P<one>.)(?P<two>.)(?P=two)(?!(?P=one)).$')
for s in strs:
    print s, p.match(s)

输出结果:

AGGH <_sre.SRE_Match object at 0x011BFC38>
TIIK <_sre.SRE_Match object at 0x011BFC38>
6^^? <_sre.SRE_Match object at 0x011BFC38>
AGGA None
ABCD None

虽然看起来不太好,但确实有效。;)在美元符号前面的句点是必须的,如果你想匹配字符串的结尾,它会消耗掉实际被扫描的字符,这个扫描是通过 (?!(?P=one)) 来完成的,这个部分叫做“负向前瞻断言”。

2

你可以这样提取字符串的模式:

def pattern(s):
    d = {}
    return [d.setdefault(c, len(d)) for c in s]

例子:

>>> pattern("AGGH")
[0, 1, 1, 2]
>>> pattern("TKKG")
[0, 1, 1, 2]
>>> pattern("AGGA")
[0, 1, 1, 0]
>>> pattern("ABCD")
[0, 1, 2, 3]

这个函数让比较两个字符串的模式变得非常简单。

撰写回答