2011-12-08 3 views
8

Qualcuno può suggerire come sarebbe stato costruito un modello per estrarre il primo elenco di numeri contigui da questi dati?Pattern ripetuto

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}; 

Ho provato varianti come sample //. {useable : _?NumberQ .., ___} -> {useable} inutilmente.

funziona bene, ma mi piacerebbe sapere come farlo utilizzando la corrispondenza dei modelli.

risposta

7

Cercando di preservare la vostra logica:

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

Se si desidera che la più lunga sequenza numerica:

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

Modifica

per ottenere tutte le sequenze numeriche:

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

o

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

Un modo potrebbe essere

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

che restituisce {52.2624, 54.4003, 60.7418, 61.3801, 62.6397, 61.7992, 63.2282} dal vostro campione.

+0

@ Simon, grazie. Ho sfiorato il passato più a lungo. –

7

Un'altra opzione sarebbe quella di cercare la prima voce non numero:

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

+1. Potrebbe usare 'Eccetto [_? NumberQ]' al posto di '_? (! NumberQ [#] &)' pure. –