R Regex: скобки не действуют как метасимволы

Я пытаюсь разбить строку на группу "%in%" и символ "@". Во всей документации и во всем, что я могу найти, говорится, что круглые скобки — это метасимволы, используемые для группировки в регулярном выражении R. Итак, код

    > strsplit('example%in%aa(bbb)aa@cdef', '[(%in%)@]', perl=TRUE)

ДОЛЖЕН дать мне

    [[1]]
    [1] "example" "aa(bbb)aa"      "cdef"

То есть скобки в "aa(bbb)aa" должны оставаться одни, потому что скобки в совпадающем выражении не экранируются. Но вместо этого это ДЕЙСТВИТЕЛЬНО дает мне

    [[1]]
    [1] "example" ""   ""    ""    "aa"    "bbb"   "aa"    "cdef"

как будто скобки не были метасимволами! Что с этим не так и как я могу это исправить? Спасибо!

Это верно как с аргументом perl=TRUE, так и без него в strsplit.


person esa606    schedule 15.01.2014    source источник
comment
Перевод классов символов Each character stands alone. То, что у вас есть, эквивалентно (?: \( | % | i | n | @ | \) )   -  person    schedule 16.01.2014


Ответы (3)


Не знаю, какую документацию вы читаете, но в разделе Расширенные регулярные выражения в ?regex говорится:

Большинство метасимволов теряют свое особое значение внутри класса символов. ... (Только '^ - \ ]' являются специальными внутри классов символов.)

Вам не нужно создавать класс символов. Просто используйте "или" | (вам, вероятно, тоже не нужно группировать "%in%", но это не повредит):

> strsplit('example%in%aa(bbb)aa@cdef', '(%in%)|@', perl=TRUE)
[[1]]
[1] "example"   "aa(bbb)aa" "cdef"
person Joshua Ulrich    schedule 15.01.2014

Здесь не нужно использовать [ или (, просто так:

strsplit('example%in%aa(bbb)aa@cdef', '%in%|@')
[[1]]
[1] "example"   "aa(bbb)aa" "cdef"     
person agstudy    schedule 15.01.2014
comment
В чем тогда разница между [ и |? - person esa606; 16.01.2014
comment
Не уверен, что это поможет, но [ — это класс символов, а | — оператор or... - person agstudy; 16.01.2014

Внутри класса символов [] большинство символов теряют свое особое значение, включая ().

Вместо этого вам может понадобиться это регулярное выражение:

'%in%|@'
person nhahtdh    schedule 15.01.2014