2013-12-21 3 views
0

Я хотел бы извлечь имена столбцов из строки, используя regexp.
Примечание: Строка, показанная ниже, является лишь малой частью фактической строки, которую я ищу.Matlab - Извлечение имен столбцов с использованием регулярных выражений

'"column_names":["Date","Open","High","Low","Last","Close","Total Trade Quantity","Turnover (Lacs)"]' 

Я сделал некоторые основные операции с regexp как поиск дат (и т.д.), но это один все еще слишком сложна для меня. Это то, что я до сих пор:

regexp(string,'(?<="column_names":[") 

Любая помощь будет оценена ...

+0

В этом примере, что бы точно быть ваш желаемый результат (ы)? –

+0

Какой двигатель использует Matlab? У вас есть ссылка? – sln

+1

@ LuisMendo Каждое имя столбца должно быть извлечено как одна строка, например: '' Date'', '' Open'', '' High'', '' Low'', '' Last'', '' Close '', '' Total Trade Quantity'', '' Turnover (Lacs) ''. – bluebox

ответ

2

Если у вас есть достаточно новой версии Matlab вы можете использовать более простую и быструю strsplit:

strsplit(string(18:end-1),'","') 

который возвращает

ans = 

    Columns 1 through 6 

    'Date' 'Open' 'High' 'Low' 'Last' 'Close' 

    Columns 7 through 8 

    'Total Trade Quantity' 'Turnover (Lacs)"' 

Если вы не имеете strsplit, то NEX т простой (и быстрый) вариант textscan:

out = textscan(string(18:end-1),'%s','Delimiter','","','MultipleDelimsAsOne',true) 
out{:}' 

Вы также можете использовать что-то вроде strfind(string,'":["'), чтобы получить индекс начала массива в том случае, если он не всегда начинается с '"column_names"'.

EDIT: Для полноты, вот регулярное выражение, которое должно работать на всю строку (предполагается, что имена столбцов могут содержать символы слова (буквы, цифры, подчеркивание), пробелы и круглые скобки):

out = regexp(string,'(?!^")"([\w\s\(\)]+)"','tokens'); 
[out{:}] 

Или вы можете использовать только, если вы обрезать строку:

out = regexp(string(18:end-1),'[\w\s\(\)]+','match') 
+0

+1 Легче, чем мой ответ –

+0

Очень элегантный, но я действительно пытаюсь реализовать его с помощью '' regexp''. – bluebox

+0

@Bluebox: Это можно сделать, но, похоже, нет причин. И 'regexp' во много раз медленнее в Matlab. Я поиграю. – horchler

1

вы можете использовать strtok:

str = '"column_names":["Date","Open","High","Low","Last","Close","Total Trade Quantity","Turnover (Lacs)"]' 

names = {}; 
remain = str; 
while ~isempty(remain) 
    [name remain] = strtok(remain,'"[],:'); 
    if ~isempty(name) 
     names{end+1} = name; 
    end 
end 

Результат:

>> names 

names = 

    'column_names' 'Date' 'Open' 'High' 'Low' 'Last' 'Close' [1x20 char] 'Turnover (Lacs)' 
+0

Очень хорошее решение, спасибо ... но я действительно ищу решение с '' repeatxp''. – bluebox

1

Это может быть сделано с 2 регулярными выражениями.
(я только предполагаю, что индексация массивов Matlab) -

namesStrs = regexp(str, '(?<="column_names":\[)[^\]]+(?=\])', 'match') 
for k = 1:length(nameStrs) 
    disp(nameStrs(k)) 
    colsStrs = regexp(namesStrs(k), '(?<=").*?(?=")', 'match') 
    for n = 1:length(colStrs) 
     disp(colStrs(n)) 
    end 
end 
+0

Вау, спасибо за помощь! – bluebox

Смежные вопросы