尝试学习正则表达式,尽管在这里有很多不错的文章,也有到regEx网站的链接,但我有一个案例,我试图摆脱纯粹的固执,以至于无法产生我想要的比赛。为了理解它,请考虑以下代码,该代码使我们可以传入字符串列表和模式,并找出模式是否与列表中的所有项目匹配或与之不匹配:

import re
def matchNone(pattern, lst):
    return not any([re.search(pattern, i) for i in lst])

def matchAll(pattern, lst):
    return all([re.search(pattern, i) for i in lst])


为了帮助进行调试,可以通过以下简单代码将_test添加到函数调用中,并查看传递给any()all()函数的内容,这些函数最终将返回结果:

def matchAll_test(pattern, lst):
    return [re.search(pattern, i) for i in lst]

def matchNone_test(pattern, lst):
    return ([re.search(pattern, i) for i in lst])


此模式和列表从True产生matchAll()

wordPattern = "^[cfdrp]an$"
matchAll(wordPattern, ['can', 'fan', 'dan', 'ran', 'pan']) # True


表面上的此图案似乎可以与matchNone()一起使用,以努力反转图案:

wordPattern = "^[^cfdrp]an|[cfdrp](^an)$"
matchNone(wordPattern, ['can', 'fan', 'dan', 'ran', 'pan']) # True


如我们希望的那样,它将返回True。但是,这种模式的真正逆转将返回值列表的False,无论它们传递给我们什么,这些值都不等于我们的原始列表['can', 'fan', 'dan', 'ran', 'pan']。 (即“匹配这5个单词以外的任何单词”)

在测试以查看此列表中单词的哪些更改将使我们获得False时,我们迅速发现该模式并不像它最初出现那样成功。如果是这样,则对于在上述列表中未包含的任何内容,matchNone()都将失败。

这些排列有助于发现我的模式测试的缺点:

["something unrelated", "p", "xan", "dax", "ccan", "dann", "ra"]

在上面的探索中,我还尝试了其他排列方式,包括原始列表,使用函数的_test版本,一次在原始单词上更改一个字母,或者从排列方式中修改一个术语或添加一个术语,例如以上是什么。

如果有人能找到我原始图案的真实反面,我很乐意看到它,因此我可以从中学习。

为了帮助您进行调查:

对于所有单词,此模式也可与matchAll()一起使用,但我似乎也无法创建其反函数:"^(can|fan|dan|ran|pan)$"

感谢您在此上花费的任何时间。我希望在这里找到一个regEx专家,他可以发现错误并提出正确的解决方案。

最佳答案

希望我能理解您的问题。这是我发现的解决方案:

^(?:[^cfdrp].*|[cfdrp][^a].*|[cfdrp]a[^n].*|.{4,}|.{0,2})$



[^cfdrp].*:如果文本开头的c,f,d,r或p不匹配
[cfdrp][^a].*:文本以c,f,d,r或p开头:如果第二个字符不是a,则匹配
[cfdrp]a[^n].*:文本以[cfdrp]a开头:如果第三个字符不是n,则匹配。
.{4,}:匹配任何超过3个字符的字符
.{0,2}:匹配0、1或2个字符的任何内容


它等于:

^(?:[^cfdrp].*|.[^a].*|..[^n].*|.{4,}|.{0,2})$

关于python - python补充复杂的正则表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42960375/

10-10 16:01