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)))+所看到这里.
| 归档时间: |
|
| 查看次数: |
1471 次 |
| 最近记录: |