How to filter set of strings with set of patterns?
19 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Robert Roos
am 11 Sep. 2020
Kommentiert: Ameer Hamza
am 11 Sep. 2020
I have a list of strings:
names = {'Robert', 'Bob', 'Charles', 'James', 'Jamie', 'Marie', 'Jamesbob'}
That I want to filter with a set of regular expression patterns:
patterns = {'.*ob', 'jam.*'}
How can I a list of the names which match with at least one of the patterns? (Without getting duplicates and while keeping the original order)
So would expect an output like:
{'Robert', 'Bob', 'James', 'Jamie', 'Jamesbob'}
I can find matches with a single pattern like:
regex_matches = regexpi(names, pattern{1}, 'match')
Can have multiple patterns without using a loop?
And here `regex_matches` is a cellarray of cellarrays. How would I turn this into a single level list?
(This questions sounds failry general but I couldn't find a previous question. Apologies if there is one.)
0 Kommentare
Akzeptierte Antwort
Ameer Hamza
am 11 Sep. 2020
Bearbeitet: Ameer Hamza
am 11 Sep. 2020
Try this
names = {'Robert', 'Bob', 'Charles', 'James', 'Jamie', 'Marie', 'Jamesbob'};
patterns = {'.*ob', 'jam.*'};
regex_matches = cell(numel(patterns), numel(names));
for i=1:numel(patterns)
regex_matches(i, :) = regexpi(names, patterns{i}, 'match');
end
idx = any(~cellfun(@isempty, regex_matches));
matched_names = names(idx);
Result
>> matched_names
matched_names =
1×5 cell array
{'Robert'} {'Bob'} {'James'} {'Jamie'} {'Jamesbob'}
2 Kommentare
Ameer Hamza
am 11 Sep. 2020
It first matches patterns{1} with the elements in name names, and then matches patterns{2} and then take logical or of both results. This approach keeps the order of names in the matched_names same as names.
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Data Type Conversion finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!