Python-Regex对于一定深度的目录

时间:2014-10-08 17:00:59

标签: python regex

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

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

如果单词“test_word”在语句中返回true

我一直在使用的是什么

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

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

所以我在dirs的语句中匹配,例如:

/user/test_word
/test_word
/test_word/test_word/

但在此示例中为false,因为它超出了两个级别。对于超出两个级别的任何事情,我不想要积极的

   /something/something/test_word/

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

5 个答案:

答案 0 :(得分:2)

我想你想要这样的东西,

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

DEMO

答案 1 :(得分:1)

假设这是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。

答案 2 :(得分:1)

怎么样:

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

不确定你是否希望第三名能够持续第三名。

答案 3 :(得分:1)

我建议你不要在这种情况下使用正则表达式。你想要的是部分完美匹配而不是模式匹配,因此浪费了计算资源。你可以简单地做到这一点:

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

答案 4 :(得分:0)

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
 (?: / | $ )