尝试学习正则表达式,尽管在这里有很多不错的文章,也有到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/