如何使用正则表达式使用Python按字母顺序查找字符串?

Sel*_*kie 12 python regex python-3.x

所以我有一个挑战,我正在努力 - 找到一个字符串中最长的字母字符串.例如,"abcghiijkyxz"应该导致"ghiijk"(是的,我加倍).

我已经做了很多循环来解决问题 - 迭代整个字符串,然后为每个字符,使用lower和ord开始第二个循环.写这个循环没有任何帮助.

但是,有人告诉我,Regex对于这类事情会很棒.我的正则表达式很弱(我知道如何获取静态集合,我的前瞻性知识延伸到知道它们存在).我如何编写正则表达式以期待,并按字母顺序检查下一个字符的下一个字符?或者是否建议使用正则表达式对此类事物不实用?

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

ctw*_*els 10

只是为了说明为什么正则表达式对于这类事情实用,这里有一个正则表达式,ghiijk在你给出的例子中是匹配的abcghiijkyxz.注意它还会匹配abc,y,x,z因为他们在技术上应该考虑以字母字符最长的字符串.不幸的是,你无法确定单独使用正则表达式的时间最长,但这确实为您提供了所有可能性.请注意,此正则表达式适用于PCRE,不适用于python的re模块!另请注意,python的regex库目前不支持(*ACCEPT).虽然我没有测试过,pyre2包(使用谷歌用Cython的RE2 pyre2 Python包装)声称,它支持(*ACCEPT)控制动词,所以这可以使用Python目前是不可能的.

请参阅此处使用的正则表达式

((?: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)))+)
Run Code Online (Sandbox Code Playgroud)

结果是:

abc
ghiijk
y
x
z
Run Code Online (Sandbox Code Playgroud)

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

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

那么如果条件不满足会怎样?嗯,这意味着(?!b)评估为假.这意味着事实上,以下字符是b允许匹配(在此实例中捕获)继续.请注意,整个模式都包含在(?:)+其中,允许我们匹配连续选项,直到满足(*ACCEPT)控制动词或行尾.

整个正则表达式的唯一例外是z.因为它是英文字母中的最后一个字符(我认为是这个问题的目标),我们不关心后面会发生什么,所以我们可以简单地说z+(?(?!$)(*ACCEPT)),这将确保之后没有任何匹配z.如果,相反,要匹配za(圆形字母顺序匹配- IDK的,如果这是正确的术语,但它听起来我的权利),可以使用z+(?(?!a)(*ACCEPT)))+所看到这里.

  • @Selkie谢谢:)我做了一个快速的小编辑,使链接在最后更加明显.查看我的编辑链接[`here`](https://regex101.com/r/RxR4Va/7)(最后).它包含一个'zzaabcddde`完全匹配的例子.要仅匹配`az`,你要使用我在上面发布的正则表达式,但要循环匹配`az`,你将使用`z +(?(?!a)(*ACCEPT)))+`subpattern作为链接显示. (2认同)
  • 我不确定我是否应该赞成这一点,因为它表明它是可能的,或者说是downvote,因为它显示了如何.这太棒了! (2认同)
  • @jpaugh谢谢,我发布了这个,老实说,我和你在同一条船上.我喜欢它,但我不喜欢它 (2认同)