You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.6 KiB
54 lines
1.6 KiB
# Doing match on a list of string or a hierarchy.
|
|
|
|
import re
|
|
import reportbug_exceptions
|
|
|
|
def egrep_list(strlist, pattern_str, subindex=None):
|
|
"""Use the pattern_str to find any match in a list of strings."""
|
|
"""Return: a list of index for the matchs into the origin list."""
|
|
|
|
if strlist is None:
|
|
return None
|
|
|
|
try:
|
|
pat = re.compile(pattern_str, re.I|re.M)
|
|
except:
|
|
raise reportbug_exceptions.InvalidRegex
|
|
|
|
resultlist = []
|
|
if subindex is None:
|
|
subindex = range(len(strlist))
|
|
for i in subindex:
|
|
if pat.search(strlist[i]):
|
|
resultlist.append(i)
|
|
return resultlist
|
|
|
|
def egrep_hierarchy(hier, pattern_str, subhier=None, nth=1):
|
|
"""Grep the nth item of a hierarchy [(x, [a, b]),...]."""
|
|
"""Return a subhier like [[n, m],[],...], n, m string index."""
|
|
resulthier = []
|
|
|
|
for i in range(len(hier)):
|
|
if subhier:
|
|
if subhier[i]: # Only if have something to match.
|
|
resultlist = egrep_list(hier[i][nth], pattern_str, subhier[i])
|
|
else:
|
|
resultlist = []
|
|
else:
|
|
resultlist = egrep_list(hier[i][nth], pattern_str)
|
|
|
|
resulthier.append(resultlist)
|
|
return resulthier
|
|
|
|
def matched_hierarchy(hier, pattern_str):
|
|
"""Actually create a new hierarchy from a pattern matching."""
|
|
mhier = []
|
|
result = egrep_hierarchy(hier, pattern_str)
|
|
for i in range(len(result)):
|
|
if result[i]:
|
|
item = [hier[i][1][y] for y in result[i]]
|
|
mhier.append((hier[i][0], item))
|
|
return mhier
|
|
|
|
# vim:ts=8:sw=4:expandtab:
|
|
|
|
|