2014-04-07 29 views
6

İki özel desen arasındaki bir dizenin bir kısmını ayıklamak için stringr paketini kullanmayı denerim. Örneğinİki farklı desen arasındaki dizenin bir parçasını ayıkla

, ben:

my.string <- "nanaqwertybaba" 
left.border <- "nana" 
right.border <- "baba" 

ve almak istiyorum (model POSIX normal ifade tarafından tanımlanan olan) str_extract(string, pattern) fonksiyonunun kullanılması ile:

"qwerty" 

Google'dan çözümler işe yaramadı.

cevap

8

Bu stringr tarafından sağlanan fonksiyonları ile mümkün olup olmadığı ve nasıl bilmiyorum ama aynı zamanda tabanını regexpr ve substring kullanabilirsiniz: gsub kullanabilirsiniz

pattern <- paste0("(?<=", left.border, ")[a-z]+(?=", right.border, ")") 
# "(?<=nana)[a-z]+(?=baba)" 

rx <- regexpr(pattern, text=my.string, perl=TRUE) 
# [1] 5 
# attr(,"match.length") 
# [1] 6 

substring(my.string, rx, rx+attr(rx, "match.length")-1) 
# [1] "qwerty" 
+0

Teşekkür ederim, sigbb! Ben sadece biraz düzeltmiştim: 1. "left.border" ve "right.border" arasındaki tüm karakterleri eşleştir, 2. right.border'ın ilk oluşumuna kadar eşleştir ve şimdi bende: rx <- regexpr (paste0 ("(? <=", left.border, ") (. *?) + (? =", right.border, ")"), metin = my.string, perl = TRUE) '. Büyük teşekkür ederim size! –

14

R base yılında. pattern'daki parantezler numaralı yakalama grupları oluşturur. Burada replacement'daki ikinci grubu, yani sınırlar arasındaki grubu seçiyoruz. ., herhangi bir karakterle eşleşir. * sıfır ya da stringr den str_match kullanmak

gsub(pattern = "(.*nana)(.*)(baba.*)", 
    replacement = "\\2", 
    x = "xxxnanaRisnicebabayyy") 
# "Risnice" 
+0

Peki, ben burada "qwerty" nin burada oturduğunu bilmiyorum, regex deseninde kullanmamın bir yolu yok! –

+0

@Marciszka: Bu örnekte "qwerty" ifadesini, normal bir ifadeyle, örn. En az bir harf için gsub (pattern = "(. * nana) ([[: alpha:]] +) (baba. *)", "\\ 2", x = my.string). – sgibb

5

bundan önceki elemanının daha fazla olduğunu ifade eder: "İlk eşlemeden () tarafından oluşturulan yakalama grupları özler str_match Bu bir karakter matris verir. Tam eşleşme için bir sütun ve her grup için bir sütun. " ref

str_match(my.string, paste(left.border, '(.+)', right.border, sep=''))[,2] 

Yukarıdaki kod paste sol ve sağ sınırları 1 veya daha fazla karakter, (dizeleri arasında boşluk) yakalar yakalama grubu (.+) bitiştirme normal bir ifade oluşturur.

Tek bir eşleşme varsayılır. Yani, [,2], str_match tarafından döndürülen matristen ikinci sütunu seçer.