2011-03-07 21 views
31

R'de, bir dizede son noktanın yerini bulmaktan daha iyi/daha basit bir yol var mı?R: Bir dizgedeki son noktayı bulma

x <- "hello.world.123.456" 
g <- gregexpr(".", x, fixed=TRUE) 
loc <- g[[1]] 
loc[length(loc)] # returns 16 

Bu, dizedeki tüm noktaları bulur ve sonuncuyu döndürür, ancak oldukça hantal görünür. Normal ifadeler kullanmayı denedim, ama çok uzağa gitmedim.

cevap

47

Bu sizin için çalışıyor mu?

x <- "hello.world.123.456" 
g <- regexpr("\\.[^\\.]*$", x) 
g 
  • \.

    Önceki ifade (bir nokta ama her şey) 0 ile arasında oluşabilecek belirtir
  • [^\.] nokta
  • * ama her şeyi eşleşen bir nokta maçları sınırsız kere
  • $ işaretler dizenin sonu.

Her şeyi bir arada ele alarak: bir noktaya kadar izleyen bir nokta bulun ve dize bitinceye kadar bir nokta bulun. R, yukarıdaki ifadede'un kaçmasını gerektirir, dolayısıyla \\ gerektirir. Regex ile deneme yapmak için regex101.com numaralı makaleye bakın.

+0

+1 şifreli ama kısa ve direkt! –

+1

a '.' bir 'kelimesiyle eşleşmek için her olası karakteri eşleştirir. bir '\' ile kaçmak zorunda kalırsınız ve talihsiz bir şekilde, bu '\' ile başka bir '\' kaçmanız gerekir. Sonunda ifaden '\\' gibi görünüyor. – CousinCocaine

27

Küçük bir sözdizimi geliştirmeye ne dersiniz?

Bu, giriş vektörünün uzunluğu 1 olan birebir örneğiniz için çalışacaktır. Değerli bir "." Almak için kaçışları kullanın. arama ve sonucu ters "ilk" olarak geçen endeksini hesaplamak için:

rev(gregexpr("\\.", x)[[1]])[1] 

Daha uygun vectorized sürümü (durumunda x uzun 1'den olan):

sapply(gregexpr("\\.", x), function(x) rev(x)[1]) 

ve başka Sessizleştirme seçenek bunun yerine kuyruk kullanmak için:

+0

+1 güzel, beni ona dövdüm. –

+0

evet, beni de yendi :) – Vincent

+0

şimdi bu temiz ... – aL3xa

4

Birisi gerçekten sevdim şu cevabı yayınlanmıştır, ama onlar sildikten fark; doğrudan sonuçları üzerinden aramak zorunda kalmadan, istenilen konuma ürettiği için

regexpr("\\.[^\\.]*$", x) 

hoşuma gidiyor. Regexp da oldukça temiz, hangi regexps endişe söz konusu olan bir istisna biraz :)

+1

evet, o bendim. Önceki çözümün işe yaradığını düşündüm, böylece onu sildim. Belki de olmamalıydım :) – Vincent

İlgili konular