2011-12-08 10 views
8

Czy ktoś może zasugerować, w jaki sposób zostanie utworzony wzorzec, aby wyodrębnić z tych danych pierwszą listę sąsiednich liczb?Powtarzalny wzór

sample = {52.2624, 54.4003, 60.7418, 61.3801, 62.6397, 61.7992, 
    63.2282, "", "", "", "", "", "", "", "", "", "", 62.3921, 61.897, 
    60.299, 59.053, 61.3778, 64.3724, 63.4251, 78.1912, 79.7451, 
    80.4741, "", 81.324, 79.9114, 93.7509}; 

Próbowałem odmian takich jak sample //. {useable : _?NumberQ .., ___} -> {useable} bezskutecznie.

useable = TakeWhile[sample, NumberQ] działa dobrze, ale chciałbym wiedzieć, jak to zrobić, używając dopasowywania wzorców.

Odpowiedz

7

Starając się zachować swoją logikę:

sample /. {useable : Longest[_?NumberQ ..], ___} -> {useable} 

Jeśli chcesz najdłuższy ciąg liczbowy:

sample /. {___, useable : Longest[_?NumberQ ..], ___} -> {useable} 

Edycja

Aby uzyskać wszystkie sekwencje numeryczne:

Cases[SplitBy[sample, NumberQ], {_?NumberQ ..}] 

lub

[email protected][sample //. {x___, useable : Longest[_?NumberQ ..], y___} :> 
               ([email protected]{useable}; {x}~Join~{y})] 
6

Jednym ze sposobów byłoby

sample /. {Longest[useable___?NumberQ], ___} :> {useable} 

która zwraca {52.2624, 54.4003, 60.7418, 61.3801, 62.6397, 61.7992, 63.2282} z próbki.

+0

@ Simon, dzięki. Przeskoczyłem tuż obok Najdłuższego. –

7

Innym rozwiązaniem byłoby spojrzeć na pierwszej pozycji niż numer:

sample /. {useable___, _?(!NumberQ[#]&), ___} :> {useable} 
+2

+1. Może używać 'Z wyjątkiem [_? NumberQ]' w miejsce '_? (! NumberQ [#] &)'. –