2015-11-17 5 views
3

Скажем, у меня есть вектор, содержащий некоторые символы, которые я хочу разбить на основе регулярного выражения.R: Регулярное выражение в strsplit (поиск "," затем заглавная буква)

Чтобы быть более точным, я хочу разбить строки на запятую, а затем пробел, а затем заглавную букву (по моему мнению, команда regex выглядит так: /(, [A-Z])/g (которая отлично работает, когда я попробуйте here)).

Когда я пытаюсь добиться этого в r, то regex, кажется, не работает, например:

x <- c("Non MMF investment funds, Insurance corporations, Assets (Net Acquisition of), Loans, Long-term original maturity (over 1 year or no stated maturity)", 
    "Non financial corporations, Financial corporations other than MFIs, insurance corporations, pension funds and non-MMF investment funds, Assets (Net Acquisition of), Loans, Short-term original maturity (up to 1 year)") 

strsplit(x, "/(, [A-Z])/g") 
[[1]] 
[1] "Non MMF investment funds, Insurance corporations, Assets (Net Acquisition of), Loans, Long-term original maturity (over 1 year or no stated maturity)" 

[[2]] 
[1] "Non financial corporations, Financial corporations other than MFIs, insurance corporations, pension funds and non-MMF investment funds, Assets (Net Acquisition of), Loans, Short-term original maturity (up to 1 year)" 

Он не находит раскола. Что я здесь делаю неправильно?

Любая помощь очень ценится!

+0

Вы не должны использовать '/.../ g'. Это не JS. И я думаю, вы не хотите опускать письмо, не так ли? Попробуйте [this] (http://ideone.com/YfnJWL). –

+0

Разделители не используются в R, а функция 'strsplit' потребляет символы. – hwnd

ответ

6

Вот решение:

strsplit(x, ", (?=[A-Z])", perl=T) 

См IDEONE demo

Выход:

[[1]] 
[1] "Non MMF investment funds"          
[2] "Insurance corporations"           
[3] "Assets (Net Acquisition of)"          
[4] "Loans"               
[5] "Long-term original maturity (over 1 year or no stated maturity)" 

[[2]] 
[1] "Non financial corporations"                     
[2] "Financial corporations other than MFIs, insurance corporations, pension funds and non-MMF investment funds" 
[3] "Assets (Net Acquisition of)"                    
[4] "Loans"                          
[5] "Short-term original maturity (up to 1 year)" 

Регулярное выражение - ", (?=[A-Z])" - содержит смотреть вперед (?=[A-Z]), который проверяет, но не потребляет заглавную письмо. В R вам нужно использовать perl=T с регулярными выражениями, которые содержат образы.

Если пространство не является обязательным, или может быть двойное пространство между запятой и заглавной буквы, используйте

strsplit(x, ",\\s*(?=[A-Z])", perl=T) 

И еще один вариант, который будет поддерживать Unicode буквы (с \\p{Lu}):

strsplit(x, ", (?=\\p{Lu})", perl=T) 
+0

Ты выиграл этот. –

+0

@ Томас: Я не думаю, что это соревнование. По крайней мере, я не думаю об этом. Мы все побеждаем здесь. Если кто-то не начнет ниспровергать без объяснения причин. –

+0

Я имел в виду, вы набрали быстрее и лучше меня, но мне было слишком лениво записать его –