gpt4 book ai didi

python - 如何使用 Regex 使用 Python 查找按字母顺序排列的字符串?

转载 作者:太空狗 更新时间:2023-10-29 17:45:42 26 4
gpt4 key购买 nike

所以我面临着一个挑战——找到一个字符串中最长的字母字符串。例如,“abcghiijkyxz”应该导致“ghiijk”(是的,i 加倍)。

我一直在使用循环来解决这个问题——遍历整个字符串,然后针对每个字符,使用 lower 和 ord 开始第二个循环。编写该循环不需要任何帮助。

但是,有人向我建议 Regex 非常适合这类事情。我的正则表达式很弱(我知道如何获取静态集,我的前瞻性知识扩展到知道它们存在)。我将如何编写一个 Regex 来向前看,并检查 future 的字符是否按字母顺序排列?或者使用 Regex 的建议对这类事情不切实际?

编辑:普遍的共识似乎是正则表达式对于这类事情来说确实很糟糕。

最佳答案

只是为了说明为什么正则表达式对于这类事情实用,这里有一个正则表达式可以匹配 ghiijk 在您给定的 abcghiijkyxz 。请注意,它还会匹配 abcyxz,因为从技术上讲,它们应该被视为最长的字符串按顺序排列的字母字符。不幸的是,您无法仅使用正则表达式来确定哪个最长,但这确实为您提供了所有可能性。请注意,此正则表达式适用于 PCRE,不适用于 python 的 re 模块!另外,请注意 python's regex库目前不支持 (*ACCEPT)。虽然我没有测试过,pyre2 package (使用 Cython 的谷歌 re2 pyre2 的 python 包装器)声称它 supports the (*ACCEPT) control verb ,因此目前可能可以使用 python。

See regex in use here

((?:a+(?(?!b)(*ACCEPT))|b+(?(?!c)(*ACCEPT))|c+(?(?!d)(*ACCEPT))|d+(?(?!e)(*ACCEPT))|e+(?(?!f)(*ACCEPT))|f+(?(?!g)(*ACCEPT))|g+(?(?!h)(*ACCEPT))|h+(?(?!i)(*ACCEPT))|i+(?(?!j)(*ACCEPT))|j+(?(?!k)(*ACCEPT))|k+(?(?!l)(*ACCEPT))|l+(?(?!m)(*ACCEPT))|m+(?(?!n)(*ACCEPT))|n+(?(?!o)(*ACCEPT))|o+(?(?!p)(*ACCEPT))|p+(?(?!q)(*ACCEPT))|q+(?(?!r)(*ACCEPT))|r+(?(?!s)(*ACCEPT))|s+(?(?!t)(*ACCEPT))|t+(?(?!u)(*ACCEPT))|u+(?(?!v)(*ACCEPT))|v+(?(?!w)(*ACCEPT))|w+(?(?!x)(*ACCEPT))|x+(?(?!y)(*ACCEPT))|y+(?(?!z)(*ACCEPT))|z+(?(?!$)(*ACCEPT)))+)

结果:

abc
ghiijk
y
x
z

单个选项的解释,即 a+(?(?!b)(*ACCEPT)):

  • a+ 匹配 a(字面意思)一次或多次。这会捕获多​​个相同字符按顺序排列的实例,例如 aa
  • (?(?!b)(*ACCEPT)) If 子句评估条件。
    • (?!b) if 子句的条件。负前瞻确保后面的内容不是 b。这是因为如果不是b,我们希望后面的控制动词生效。
    • (*ACCEPT) 如果满足(上述)条件,我们接受当前的解决方案。这个控制动词使正则表达式成功结束,跳过模式的其余部分。由于此 token 位于捕获组内,因此只有该捕获组在该特定位置成功结束,而父模式继续执行。

那么如果不满足条件会怎样呢?好吧,这意味着 (?!b) 的计算结果为 false。这意味着后面的字符实际上是 b,因此我们允许匹配(在本例中是捕获)继续进行。请注意,整个模式都包含在 (?:)+ 中,这使我们可以匹配连续的选项,直到遇到 (*ACCEPT) 控制动词或行尾。

整个正则表达式的唯一异常(exception)是 z。因为它是英文字母表中的最后一个字符(我认为这是这个问题的目标),我们不关心后面是什么,所以我们可以简单地把 z+(?(?!$)(*ACCEPT )),这将确保在 z 之后没有匹配项。相反,如果您想要匹配 za(循环字母顺序匹配 - idk 如果这是正确的术语,但对我来说听起来不错)您可以使用 z+(?(?!a )(*ACCEPT)))+ 如图所示 here .

关于python - 如何使用 Regex 使用 Python 查找按字母顺序排列的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48588490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com