【问题标题】:Python- Regex for dir of certain depthPython- 特定深度目录的正则表达式
【发布时间】:2014-10-08 17:00:59
【问题描述】:

我有一个正则表达式,但它并不适用于所有情况。

我需要它能够在两个深度级别内匹配以下任何情况:

如果语句中包含这个单词“test_word”,则返回 true

我一直在使用的东西没有用

('^/[^/]*/test_word/.+')

('^/test_word/.+')**

所以我在语句中匹配如下目录:

/user/test_word
/test_word
/test_word/test_word/

但在此示例中为 false,因为它超出了两个级别。我不希望超过两个级别的任何东西都是积极的

   /something/something/test_word/

你能想到的任何事情都可能发生。

【问题讨论】:

  • 通过您的示例,您是在描述当前正在发生的事情还是您想要发生的事情?前两个真实示例的一个问题是它们没有尾部斜杠,但您的两个正则表达式都需要它。
  • @aelfric5578,OP 正在测试第一个或第二个表达式,它成功匹配前 3 个示例目录。但是,当test_word 像第 4 个示例那样在结构中更深时,OP 就会遇到问题。
  • 下一次,修改你原来的问题,而不是开始一个新的问题。除了等级限制之外,和第一个完全没有区别。
  • 我不希望人们在他们已经为其他问题提供答案时因为改变问题而生我的气。在过去,我被要求做与你所要求的相反的事情。特别是在代码审查中。不过,感谢您的精彩回答。

标签: python regex


【解决方案1】:

我想你想要这样的东西,

^(?=.*?/test_word)(?!.*?//)\/(?:[^/]*)(?:/[^/]*)?/?$

DEMO

【讨论】:

  • 这是一个有用的链接。我一直使用 pythonregex.com,但这提供了更多信息。
  • 这将匹配/test_words/blah 即,其中'test_word' 不是完整名称。否则——完美!
  • @dawg 现在看来还可以^(?=.*?/test_word(?=/|$))(?!.*?//)\/(?:[^/]*)(?:/[^/]*)?/?$ regex101.com/r/yT4uD1/4
  • inner lookahead 断言字符串 test_word 必须跟在行尾锚或正斜杠之后。
  • 这是矫枉过正的做法。
【解决方案2】:

假设这是 python 2.7(尚未使用 3),您实际上并不需要任何库,只需要内置字符串函数,这就是我处理它的方式:

testword = "test_word"
stringToCheck = "/something/something/TeSt_wOrD/"

def testForWord(string):
    if testword in string.lower(): return True
    else: return False

print testForWord(stringToCheck)

如您所见,它检查任何大小写,因为它只检查所有大小写是否为小写。我不是 100% 确定这是否是您需要的,但我认为应该这样做:D。

【讨论】:

  • 在 *nix 系统中,每个字符串都小写,尤其是处理路径,这不是一个好主意。
【解决方案3】:

怎么样:

lines = '''\
/user/test_word
/test_word
/test_word/test_word/
/something/something/test_word/
/user/test_word/
/test_word/
/test_word/test_word
/something/something/test_word
/user/test_word/more
/test_word/more
/test_word/test_word/more
/something/something/test_word/more
/something/test_word/test_word
/test_wordxx
/something/test_wordxx
'''.splitlines()

import re
for line in lines:
    if re.match('/(?:[^/]+/)?test_word(?:/|$)',line):
        print('YES',line)
    else:
        print('NO ',line)

输出:

YES /user/test_word
YES /test_word
YES /test_word/test_word/
NO  /something/something/test_word/
YES /user/test_word/
YES /test_word/
YES /test_word/test_word
NO  /something/something/test_word
YES /user/test_word/more
YES /test_word/more
YES /test_word/test_word/more
NO  /something/something/test_word/more
YES /something/test_word/test_word
NO  /test_wordxx
NO  /something/test_wordxx

不确定你是否想要第三个到最后一个。

【讨论】:

  • 到目前为止,我所有的测试用例都与您的表达方式正确。倒数第三个是正确的。
【解决方案4】:

我建议您在这种情况下不要使用正则表达式。你在这里想要的是部分完美匹配而不是模式匹配,所以这是一种计算资源的浪费。你可以这样做:

import os
filepath = #init
hier = filepath.split(os.path.sep)
print 'right' if hier[1] == 'test_word' or hier[2] == 'test_word' else 'wrong'

【讨论】:

    【解决方案5】:

    2级

    ^/(?:[^/\r\n]*/){0,1}test_word(?:/|$)
    

    展开:

     ^ 
     /
     (?: [^/\r\n]* / ){0,1}
     test_word
     (?: / | $ )
    

    对于 N 级 (>= 2)

    ^/(?:[^/\r\n]*/){0,N-1}test_word(?:/|$)
    

    展开:

     ^ 
     /
     (?: [^/\r\n]* / ){0,N-1}
     test_word
     (?: / | $ )
    

    【讨论】:

    • 这是一个动态的答案。谢谢。
    • 不是动态的,可能是静态的。
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 2021-10-03
    • 2021-04-20
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多