Python 正则匹配字母序列
我想写一个正则表达式,能够匹配像“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]
这个函数让比较两个字符串的模式变得非常简单。