2015-11-05 3 views
0

Я нашел работу вокруг этой проблемы в моем скрипте, как показано ниже, но почему это происходит?Список объектов 'ls()' с совпадением шаблонов - слишком много совпадений

Использование ls(pattern= ...) с использованием дикой карты приводит к большему количеству результатов, чем фактическое совпадение, если между символом * и шаблоном не требуется дополнительный символ или пробел.

Я чувствую, что здесь отсутствует основное правило сопоставления шаблонов. Спасибо за вашу помощь.

b_fa=NULL 
b_fb=NULL 
b_fc=NULL 
b_fd=NULL 

ls(pattern="b_fa*") 
[1] "b_fa" "b_fb" "b_fc" "b_fd" 

ls(pattern=b_fa_*) 
[1] "b_fa" 

Хотя Wrongly Making an Empty Match делает прикосновение к подобным проблемам не попасть в сердце этого вопроса, а именно: Почему с помощью * удалить букву предыдущей к ней при обнаружении совпадения?

+4

прочитал документацию 'regex'. '*' также для 0-кратного символа перед – jogo

+0

@jogo: Я понимаю, что описанное вами использование * выполняется в соответствии с регулярным выражением (regex), и в этом случае это означает, что предыдущий элемент будет соответствовать нулю или более раз . "{регулярная документация}. –

+0

После дальнейшего чтения я думаю, что я решил проблему. Хотя в документации по регулярному выражению «A» регулярное выражение является ** шаблоном **, который описывает набор ** строк *. регулярные выражения могут фактически быть любым единственным значением, которое не является метасимволом, таким как * или +, поэтому, когда a * помещается перед регулярным символом, он рассматривает его как регулярное выражение и обрабатывает единственный символ, как описывает @jogo. –

ответ

0

Короче * обрабатывает предыдущий символ в виде регулярного выражения и проверки любых матчей, включая 0 или более повторений этого символа, аналогично замечанием @jogo.

Мое замешательство было вызвано определением и объяснением, приведенным в R, слишком буквальным. Оба могут быть найдены с использованием ?regexp.

Definition: 
A ‘regular expression’ is a pattern that describes a set of strings. 

Explanation: 
A regular expression may be followed by one of several repetition quantifiers: 
* The preceding item will be matched zero or more times. 

Хотя в документации регулярное выражение, «A„регулярное выражение“является шаблоном, который описывает„набор строк“, таких как [[:alnum:]], а регулярные выражения могут быть фактически любое одно значение, которое не метасимволом, таких как . * или +, поэтому, когда * находится в передней части обычного символа символ трактуется как регулярное выражение, содержащего одну строки символов и обрабатываются как таковой

как заявлено @Frank: Я использовал в качестве * дикая карта, это не так.
период . соответствует любому персонажу; это самая близкая вещь для дикой карты.

0

попробовать pattern="b_faa*" или pattern="b_fa+" или pattern="b_fa.*"

Смежные вопросы