Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中,正则表达式是否可以匹配某组字母,只要它们不';不按顺序发生吗?_Python_Regex - Fatal编程技术网

在python中,正则表达式是否可以匹配某组字母,只要它们不';不按顺序发生吗?

在python中,正则表达式是否可以匹配某组字母,只要它们不';不按顺序发生吗?,python,regex,Python,Regex,我正试图从目录中筛选出文件。它们的名称通常如下所示: Foo_101.zip Bar\u 99.zip McFoo_103.zip Baz\u HELLO\u 56.zip Foo\u Bar\u 99.zip 我对要匹配的文件名的要求如下: 大写(例如,Baz_103.zip) 有一个或多个字母(大写或小写),其中没有一个包含HELLO(例如Foo\u Baz\u McBar\u 99.zip) 有一个或多个下划线(例如Foo\u Bar\u Baz\u 100.zip) 下划线不能与其他

我正试图从目录中筛选出文件。它们的名称通常如下所示:

  • Foo_101.zip
  • Bar\u 99.zip
  • McFoo_103.zip
  • Baz\u HELLO\u 56.zip
  • Foo\u Bar\u 99.zip
我对要匹配的文件名的要求如下:

  • 大写(例如,
    Baz_103.zip
  • 有一个或多个字母(大写或小写),其中没有一个包含
    HELLO
    (例如
    Foo\u Baz\u McBar\u 99.zip
  • 有一个或多个下划线(例如
    Foo\u Bar\u Baz\u 100.zip
  • 下划线不能与其他下划线相邻(例如,
    Foo\uu Bar\u 101.zip
    无效,因为有两个下划线彼此相邻)
  • .zip
    扩展名前以下划线和一个或多个数字结尾(例如
    Foo\u Bar\u Baz\u 100.zip
    \u 100.zip
    结尾)
  • 我需要过滤掉
    Baz_HELLO_56.zip,因为它没有满足第二个要求:它有一个或多个字母,所有字母都包含
    HELLO

    我最接近于消极前瞻的是:

    ^([A-Z]{,1}[a-zA-Z]+[\-_])+(?!HELLO_\d+.zip)\d+.zip$
    
    它成功地排除了Baz_HELLO_56.zip
    。但是,它也不包括
    McFoo_103.zip


    我有没有办法调整这个正则表达式模式,只排除
    Baz_HELLO_56.zip
    ,而不排除
    McFoo_103.zip

    你可以用能反映你的第二和第四个要求的头像做你想做的事情,然后匹配整个名字,以大写字母开始,包括字母、
    -
    ,以
    \uuu
    结尾,数字和
    .zip

    ^(?!.*HELLO)(?!.*__)[A-Z][A-Za-z_-]*_\d+\.zip$
    
    请注意,您的第三项要求自动包含在第五项要求中


    您还可以使用一个向前看来断言HELLO不会发生,匹配大写字符,后跟混合的大写和小写字符

    然后使用以下划线开头并匹配混合大小写字符的重复模式来防止相邻的下划线

    ^(?!.*HELLO)[A-Z][A-Za-z]*(?:_[A-Za-z]+)*_\d+\.zip$
    
    关于图案

    • ^
      字符串的开头
    • (?!*HELLO)
      负前瞻,断言没有HELLO出现(或使用HELLO)
    • [A-Z][A-Za-Z]*
      匹配单个字符A-Z,然后0+乘以字符A-Za-Z
    • (?:[A-Za-z]+)*
      重复0+次匹配
      后接1+次字符A-Za-z
    • \ud+\.zip
      匹配
      \ucode>,1+位和
      .zip
    • $
      字符串结尾
    |


    您具体匹配的是什么?因为你可以只做
    ^Baz\u HELLO\u 56\.zip$
    ,但显然这不是你想要的。我已经澄清了问题中的要求。你说“它有一个或多个字母组成
    HELLO
    ”是什么意思?一个字母“HELLO
    ”如何构成?我发现我的部分解释与要求不符。我会解决的。