Я хотел бы реализовать команду unix `grep -r 'в функции python. Я знаю о command.getstatusoutput(), но пока я не хочу использовать это. я пришел с этим:grep -r в python
def grep_r (str, dir):
files = [ o[0]+"/"+f for o in os.walk(dir) for f in o[2] if os.path.isfile(o[0]+"/"+f) ]
return [ l for f in files for l in open(f) if str in l ]
, но это, конечно, не использует регулярное выражение, он просто проверяет, «ул» подстрока «л». поэтому я пробовал следующее:
def grep_r (pattern, dir):
r = re.compile(pattern)
files = [ o[0]+"/"+f for o in os.walk(dir) for f in o[2] if os.path.isfile(o[0]+"/"+f) ]
return [ l for f in files for l in open(f) if r.match(l) ]
но это не работает, оно не дает мне совпадений даже там, где выполнялась первая функция. что изменилось? я мог бы просто разбить его на кучу вложенных циклов, но я больше заинтересован в том, чтобы быть кратким, чем читаемым.
да, у меня это почти не читаемым, с тех пор как я прочитал this article by Peter Norvig я держать положить эти «я для г в some_generator 'в моем коде ... – aaronstacy
О, его естественное желание использовать мощные абстракции! Я использовал для создания чудовищных многострочных конструкций map() и reduce() до того, как возникли соображения списка - мне очень понравилась идея «сделайте это, для всех THESE» вместо «Ok, сделайте следующий и сделайте ... Хорошо, сделай следующий и делай ... »Но я узнал, что мои коллеги не могут распутать его, и это точно так же, как на компьютере. –
Если вам нравится этот орфографический корректор, вы должны изучить haskell. Функциональные отображения на множествах являются естественными http://github.com/timrobinson/spell-correct/blob/master/Correct.hs –