Je voudrais implémenter la commande unix 'grep -r' dans une fonction python. Je sais à propos de commands.getstatusoutput(), mais pour l'instant je ne veux pas l'utiliser. Je suis venu avec ceci:grep -r en 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 ]
mais bien sûr ne pas utiliser une expression régulière, il vérifie juste si « str » est une sous-chaîne de « l ». donc j'ai essayé ce qui suit:
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) ]
mais cela ne fonctionne pas, il ne me donne aucune correspondance même là où la première fonction a fait. Qu'est ce qui a changé? Je pourrais juste le diviser en un tas de boucles imbriquées, mais je suis plus intéressé à être succinct que lisible. Re.match ne vérifie que le début de la chaîne.
oui, le mien est à peine lisible, depuis que je lis this article by Peter Norvig je continue à mettre les « i pour i dans some_generator 'déclarations dans mon code ... – aaronstacy
Oh c'est naturel de vouloir utiliser les abstractions puissantes! J'avais l'habitude de faire de monstrueuses constructions multi-lignes de map() et reduce() avant que les compréhensions de listes ne se manifestent - j'ai vraiment aimé l'idée de "faire ceci, à tous" au lieu de "Ok le prochain et fais ... Ok, prenez le prochain et faites ... "Mais j'ai appris que mes collègues ne pouvaient pas le démêler, et c'est exactement la même chose à l'ordinateur. –
Si vous aimez ce correcteur d'orthographe, vous devriez apprendre haskell. Les mappages de fonction sur les ensembles est un http://github.com/timrobinson/spell-correct/blob/master/Correct.hs naturel –