dire que nous avons une à plusieurs couches itérables avec des chaînes au niveau « final », oui chaînes sont itératives, mais je pense que vous obtenez mon sens:Grep itérables à couches multiples pour les chaînes qui correspondent à (Python)
['something',
('Diff',
('diff', 'udiff'),
('*.diff', '*.patch'),
('text/x-diff', 'text/x-patch')),
('Delphi',
('delphi', 'pas', 'pascal', 'objectpascal'),
('*.pas',),
('text/x-pascal',['lets', 'put one here'],)),
('JavaScript+Mako',
('js+mako', 'javascript+mako'),
('application/x-javascript+mako',
'text/x-javascript+mako',
'text/javascript+mako')),
...
]
Y at-il un moyen pratique que je pourrais mettre en œuvre une recherche qui me donnerait les indices des chaînes correspondantes? Je voudrais quelque chose qui agirait quelque chose comme ça (où la liste ci-dessus est data
):
>>> grep('javascript', data)
et ce serait revenir [(2,1,1), (2,2,0), (2, 2,1), (2,2,2)] peut-être. Il me manque peut-être une solution comparable qui ne renvoie rien de ce genre mais qui peut m'aider à trouver des chaînes dans une liste multi-couches d'itérations des itérations de .... chaînes.
J'ai écrit un peu mais il semblait juvénile et inélégant alors j'ai pensé que je demanderais ici. Je suppose que je pourrais continuer à imbriquer l'exception de la façon dont j'ai commencé ici au nombre de niveaux que la fonction supporterait alors, mais j'espérais obtenir quelque chose de net, abstrait, pythonique.
import re
def rgrep(s, data):
''' given a iterable of strings or an iterable of iterables of strings,
returns the index/indices of strings that contain the search string.
Args::
s - the string that you are searching for
data - the iterable of strings or iterable of iterables of strings
'''
results = []
expr = re.compile(s)
for item in data:
try:
match = expr.search(item)
if match != None:
results.append(data.index(item))
except TypeError:
for t in item:
try:
m = expr.search(t)
if m != None:
results.append((list.index(item), item.index(t)))
except TypeError:
''' you can only go 2 deep! '''
pass
return results
Il serait utile que vous montriez ce que vous avez déjà fait et quelle partie de votre propre solution vous pose problème. –