gpt4 book ai didi

python补充一个复杂的正则表达式

转载 作者:太空宇宙 更新时间:2023-11-04 10:02:09 26 4
gpt4 key购买 nike

尝试学习正则表达式,尽管这里有一些很棒的帖子和指向 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])

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

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() 将在上述列表之外的任何内容上失败。

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

[“不相关的东西”,“p”,“xan”,“dax”,“ccan”,“dann”,“ra”]

在我对上述内容的探索中,我尝试了其他排列以及采用原始列表,使用函数的 _test 版本并在原始单词上一次更改一个字母,或者修改一个术语或从上面的排列中添加一个术语。

如果有人能找到我的原始模式的真正反面,我很乐意看到它,这样我就可以从中学习。

帮助您进行调查:

此模式也适用于所有单词的 matchAll(),但我似乎也无法创建它的反函数:"^(can|fan|dan|ran|pan)$ "

感谢您花在这上面的时间。我希望能在这里找到能发现错误并提出正确解决方案的正则表达式专家。

最佳答案

希望我理解了您的问题。这是我找到的解决方案:

^(?:[^cfdrp].*|[cfdrp][^a].*|[cfdrp]a[^n].*|.{4,}|.{0,2})$
  • [^cf​​drp].*:如果文本不是以 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补充一个复杂的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42960375/

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