os.walk и некоторые тесты - PullRequest
       23

os.walk и некоторые тесты

0 голосов
/ 22 октября 2009

Я не уверен, правильно ли я понимаю, как os.walk хранит свои результаты.

Я пытаюсь сделать следующее:

Я проверяю корневую папку для последующих папок. Их несколько сотен, и они вложены каким-то единообразным способом.

Я пытаюсь проверить каждую подпапку и, если она заканчивается четырехзначным числом, сохранить ее в списке.

Я использовал очень процедурный код и получил его, но код использует os.listdir, что означает, что мне нужно выполнять функцию для каждой папки, которую я хочу.

Есть ли лучший способ?

def ListadorPastas(pasta):

    resultado = []

    regex = "^[0-9]{4}"
    padrao = re.compile(regex)

    for p in os.listdir(pasta):
        regexObject = re.match(padrao,p[-4:])
        if (regexObject!=None):
            resultado.append(regexObject.string)
        else:
            pass
    return resultado

Кроме того, у меня есть проблема с регулярным выражением: это регулярное выражение совпадает с последними четырьмя нарезанными цифрами выражения. Иногда у меня есть папки с 5 цифрами в конце, которые также будут соответствовать. Я пытался использовать "$ [0-9] {4}", но он ничего не возвращает. Есть идеи почему?

Заранее спасибо.

George

Ответы [ 3 ]

3 голосов
/ 22 октября 2009

используя "$ [0-9] {4}", но он возвращает меня ничего такого. Есть идеи почему?

$ означает конец (строку или строку) в шаблоне регулярных выражений, поэтому мне интересно, как вы ожидали, что «конец строки, а затем четыре цифры» когда-либо будет соответствовать чему-либо ...? По определению «конец» не будет 4 цифр! r'(^|\D)\d{4}$' должно работать лучше, если я понимаю, что вы хотите, чтобы совпадать со строками, состоящими всего из 4 цифр, или заканчиваться ровно 4 цифрами, а не 5 или более (\D означает не цифру, как \d означает цифру - нет причин использовать [0-9] или [^0-9]!).

os.walk не нужно много хранить - пара указателей на неявном дереве, по которому оно идет, - но почему вас волнует, как оно реализовано внутри? Просто используйте это ...:

def ListadorPastas(pasta):
    resultado = []
    for root, dirs, files in os.walk(pasta):
        for d in dirs:
          if (len(d)==4 or len(d)>4 and not d[-5].isdigit()
             ) and d[-4:].isdigit():
              resultado.append(d)
    return resultado

, где я также пользуюсь возможностью, чтобы показать нерегулярный способ выполнения желаемых проверок на имя подкаталога.

0 голосов
/ 22 октября 2009

О регулярном выражении: если вы используете p[-4:], вы всегда будете смотреть на последние четыре символа p, поэтому у вас не будет возможности увидеть, действительно ли их пять.

Так что вместо этого используйте

regex = "(?<![0-9])[0-9]{4}$"
padrao = re.compile(regex)

regexObject = re.search(padrao, p)

re.search также будет соответствовать частям строки.

0 голосов
/ 22 октября 2009

регулярное выражение, которое вы должны использовать:

pattern = re.compile(r'(?<!\d)\d{4}$')
re.search(pattern, p)

что касается os.walk ваше объяснение не совсем понятно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...