2015-12-16 6 views
-3

Я хочу, чтобы разбить строку всякий раз, когда он встречает «а», при условии, «а» не должно сопровождаться «Ъ»strsplit конкретным характером, provied этот символ не должен сопровождаться особым характером

string <- "abcgualoo87ahhabta" 

я должен получить выход в

string <- [1]abcgua 
[2]loo87a 
[3]hhabta 
+0

Посмотрите на регулярных выражений учебник, который объясняет отрицательный предпросмотр. – Roland

+1

Почему последний 'a' разбит? Не вычисляется с помощью 1-3 элементов, в которых расщепление 'a' является последним символом (а не первым). Попробуйте 'strsplit (string," (? <= A) (?! b) ", perl = TRUE)' и послушайте совет @ Roland. – nicola

+1

@nicola, я добавил вашу строку в свой ответ, чтобы сделать ее более заметной, если вы хотите опубликовать ее как отдельный ответ, позвольте мне не так, чтобы я мог удалить вашу строку (или не стесняйтесь редактировать мой A, чтобы удалить последнюю часть) – Cath

ответ

2
string <- "abcgualoo87ahhabta" 
unlist(strsplit(gsub("a([^b])", "a \\1", string), split=" ")) 
# [1] "abcgua" "loo87a" "hhabta" 
6

Вы можете разделить вашу строку с шаблоном «а не следуют Ъ» с регулярным выражением a(?=[^b]) в strsplit:

split_str <- strsplit("abcgualoo87ahhabta", "a(?=[^b])", perl=TRUE)[[1]] 
split_str 
#[1] "abcgu" "loo87" "hhabta" 

объяснение расщепленной схеме: опережения ((?=)) используется с, как «опережения» модель, ничего, кроме Ь ([^b]) (^ знак указывает на отрицание). Для того, чтобы опережения работать (интерпретироваться), необходимо установить параметр perl в TURE

После этого вы можете добавить удаленный «а» в конце расщепленных частей, кроме последнего:

split_str <- paste0(c(rep("a", length(split_str)-1), "")) 
#[1] "abcgua" "loo87a" "hhabta" 

хороший один шаг альтернатива обеспечивается @nicola в комментариях:

split_str <- strsplit("abcgualoo87ahhabta","(?<=a)(?!b)", perl=TRUE)[[1]] 
#[1] "abcgua" "loo87a" "hhabta" 
+0

. Я действительно призываю вас использовать 'TRUE' и' FALSE' вместо 'T' и' F'. –

+0

@CathG было бы здорово, если бы вы могли объяснить значение (? = [^ B]), а также добавить другое условие, которое разделяет строку, если мы получим «a» или «g», а не букву «b». как преследовать в таком сценарии –

+0

@DHWANIDHOLAKIA Я отредактировал с объяснением, дайте мне знать, если это нормально, или вы хотите получить более подробную информацию. – Cath