2014-10-08 3 views
0

У меня есть выражение регулярного выражения, но оно не работает для всех случаев.Python-Regex для dir определенной глубины

Мне это нужно, чтобы быть в состоянии соответствовать любому случаю следующих в пределах двух уровней глубины:

Если это слово «test_word» в заявлении возвращает истину

То, что я использую не работает

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

или

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

Так что я в состоянии соответствия в которых:

/user/test_word 
/test_word 
/test_word/test_word/ 

, но false в этом примере, потому что он выходит за пределы двух уровней. Я не хочу положительного ни на чем за пределами двух уровней.

/something/something/test_word/ 

и все, что вы можете думать об этом, может случиться.

+1

С примерами вы описываете, что происходит в данный момент или что вы хотите?Одна из проблем с первыми двумя истинными примерами заключается в том, что у них нет конечной косой черты, но для этого требуется ваше регулярное выражение. – aelfric5578

+0

@ aelfric5578, OP тестирует как первое ИЛИ второе показанное выражение, которое успешно совпадает с первыми 3 примерами каталогов. Однако у ОП возникают проблемы, когда 'test_word' глубже в структуре, как в 4-м примере. – Sam

+0

Дубликат http://stackoverflow.com/questions/26261592/python-regex-for-dir – vks

ответ

2

Я думаю, что вы хотите что-то вроде этого,

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

DEMO

+0

Это полезная ссылка. Я всегда использовал pythonregex.com, но это дает гораздо больше информации. – aelfric5578

+0

Это будет соответствовать '/ test_words/blah', т. Е. Где« test_word »не является полным именем. В противном случае - отлично! – dawg

+0

@dawg теперь кажется ok '^ (? =. *?/Test_word (? =/| $)) (?!. *? //) \/(?: [^ /] *) (?:/[^/] *)? /? $ 'http://regex101.com/r/yT4uD1/4 –

1

Предполагая, что это питон 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.

+0

в системе * nix, нижняя обсадка каждой струны, особенно обработка пути, не является хорошей идеей. – HuStmpHrrr

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 

Не уверен, что если вы хотите третий в последний.

+0

До сих пор все мои тестовые примеры верны вашему выражению. Третий снизу правильный. – user3590149

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' 
0

для 2 уровней

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

Expanded:

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

Для N уровней (> = 2)

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

Expanded:

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

Это динамичный ответ. Благодарю. – user3590149

+0

Не очень динамичный, вероятно статичный. – sln

Смежные вопросы