diff --git a/beets/library.py b/beets/library.py index 4d0fb0328..810b19464 100644 --- a/beets/library.py +++ b/beets/library.py @@ -361,6 +361,21 @@ class SubstringQuery(FieldQuery): value = getattr(item, self.field) or '' return self.pattern.lower() in value.lower() +class RegexpQuery(FieldQuery): + """A query that matches a regular expression in a specific item field.""" + def __init__(self, field, pattern): + super(RegexpQuery, self).__init__(field, pattern) + self.regexp = re.compile(pattern) + + def clause(self): + clause = self.field + " REGEXP ?" + subvals = [self.pattern] + return clause, subvals + + def match(self, item): + value = getattr(item, self.field) or '' + return self.regexp.match(value) is not None + class BooleanQuery(MatchQuery): """Matches a boolean field. Pattern should either be a boolean or a string reflecting a boolean. @@ -417,17 +432,23 @@ class CollectionQuery(Query): r'(\S+?)' # the keyword r'(?