Python正则表达式匹配字母序列

发布于 2024-11-14 15:57:53 字数 93 浏览 3 评论 0原文

我想制作一个正则表达式来匹配“AGGH”、“TIIK”、“6^^?”或其他但不是“AGGA”、“ABCD”。基本上重要的是字母的模式。有没有办法询问您以前拥有或没有的角色?

I want to make a regex to match "AGGH", "TIIK", "6^^?" or whatever but not "AGGA", "ABCD". Basically its the pattern of letters which matters. Is there a way to ask for a character you have or haven't previously had?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

○愚か者の日 2024-11-21 15:57:53

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

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]

此函数使比较两个字符串的模式变得很简单。

You could extract the pattern of your strings like this:

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

Examples:

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

This function makes it trivial to compare the pattern of two strings.

冷︶言冷语的世界 2024-11-21 15:57:53

有一种方法可以使用正则表达式来做到这一点:

import re
strs=("AGGH", "TIIK", "6^^?" ,"AGGA", "ABCD")
p = re.compile('^(?P<one>.)(?P<two>.)(?P=two)(?!(?P=one)).

输出:

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)) 扫描的实际字符,这是“负前瞻断言”。

) for s in strs: print s, p.match(s)

输出:

它很丑陋,但它有效。 ;) 如果要匹配到字符串末尾,则需要美元符号之前的句点,它会消耗 (?!(?P=one)) 扫描的实际字符,这是“负前瞻断言”。

There is a way to do it with a regex:

import re
strs=("AGGH", "TIIK", "6^^?" ,"AGGA", "ABCD")
p = re.compile('^(?P<one>.)(?P<two>.)(?P=two)(?!(?P=one)).

output:

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

It's ugly, but it works. ;) The period before the dollar sign is needed if you want to match to end of string, it consumes the actual character which is scanned by the (?!(?P=one)), which is a "negative lookahead assertion".

) for s in strs: print s, p.match(s)

output:

It's ugly, but it works. ;) The period before the dollar sign is needed if you want to match to end of string, it consumes the actual character which is scanned by the (?!(?P=one)), which is a "negative lookahead assertion".

梦里南柯 2024-11-21 15:57:53

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

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

Why not just use substring search?

if "AGGH" in myStr:
    print "Success!"
絕版丫頭 2024-11-21 15:57:53

是的,您可以使用条件正则表达式:

(?(id/name)yes-pattern|no-pattern)

请参阅 http://docs.python.org/library 查看详细信息/re.html

Yes, you can use conditional regex:

(?(id/name)yes-pattern|no-pattern)

See the details at http://docs.python.org/library/re.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文