Select last numeric character(s) of the string

조회 수: 56 (최근 30일)
Aleksandra Budzinska
Aleksandra Budzinska 2023년 4월 25일
댓글: Dyuman Joshi 2023년 4월 26일
Hello,
I'm hoping for an advise on the code which has to do with extracting the digits (either 1,2 or 3) from the string which includes different condition names. It's about a rating from -100 to 100 given to different conditions.
In our other script the output gave the ratings saves as: e.g "sucrose: 10". Now it's: e.g. "sucrose10".
How can I extract the last numbers occurring at the end of different strings? I'll provide the code we had below to deal with the separation using ":" which now doesn't work.
log.rating = zeros(height(log),1);
for l = 1:height(log)
if contains(char(log.Code(l)),'score','IgnoreCase',true)
scorestring = char(log.Code(l));
if strcmp(scorestring(end-3:end),'-100')
log.rating(l) = str2double(str(scorestring(end-3:end)));
elseif ~contains(scorestring(end-2:end))
log.rating(l) = str2double(str(scorestring(end-2:end)));
else
log.rating(l) = str2double(str(scorestring(end-1:end)));
end
else
log.rating(l) = NaN;
end
end
Many thanks!!
  댓글 수: 1
Aleksandra Budzinska
Aleksandra Budzinska 2023년 4월 25일
The example strings are: 'Sucrose low10','Sucrose high-100','Erythritol high5','Erythritol low-10', 'Control0'

댓글을 달려면 로그인하십시오.

채택된 답변

Stephen23
Stephen23 2023년 4월 25일
편집: Stephen23 2023년 4월 25일
"How can I extract the last numbers occurring at the end of different strings?"
X = "sucrose-10";
Y = str2double(regexp(X,'[-+]?\d{1,3}$','match','once'))
Y = -10
This replaces your innermost IF-ELSEIF-ELSE-END. You could probably use it to replace you entire FOR loop too.
It detects from 1 to 3 digits at the end of the text.
It will also detect an optional +/- sign in front of those digits.
See also:
  댓글 수: 2
Stephen23
Stephen23 2023년 4월 25일
편집: Stephen23 2023년 4월 25일
Assuming that LOG is a table (you did not explain this in your question):
log = array2table(["scoreABC-23";"DEF 100";"scoreGHI-100";"JKLscore: 99"], 'VariableNames',{'Code'})
log = 4×1 table
Code ______________ "scoreABC-23" "DEF 100" "scoreGHI-100" "JKLscore: 99"
idx = contains(log.Code,'score','IgnoreCase',true);
log.Rating = nan(size(log.Code));
log.Rating(idx) = str2double(regexp(log.Code(idx),'[-+]?\d{1,3}$','match','once'))
log = 4×2 table
Code Rating ______________ ______ "scoreABC-23" -23 "DEF 100" NaN "scoreGHI-100" -100 "JKLscore: 99" 99
Don't fight MATLAB with loops and IFs. Think in terms of vectors and matrices.
Aleksandra Budzinska
Aleksandra Budzinska 2023년 4월 25일
Dear @Stephen23 the first sugegstion worked very well and indeed I got rid of the IF-ELSEIF-ELSE-END parts. Thank you very much!!

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Kevin Holly
Kevin Holly 2023년 4월 25일
output = 'sucrose: 10';
numbers = str2double(extract(output, digitsPattern))
numbers = 10
output = "sucrose10";
numbers = str2double(extract(output, digitsPattern))
numbers = 10
  댓글 수: 2
Aleksandra Budzinska
Aleksandra Budzinska 2023년 4월 25일
Dear Kevin,
Thanks for your quick reaction although I don't understand the difference between your first and second code.
I was trying to use for all the possible lengths of the digits we might have but it doesn't work properly:
if strcmp(scorestring(end-3:end),'-100')
log.rating(l) = str2double(extract(scorestring(end-3:end)));
elseif ~contains(scorestring(end-2:end))
log.rating(l) = str2double(extract(scorestring(end-2:end)));
else
log.rating(l) = str2double(extract(scorestring(end-1:end)));
Dyuman Joshi
Dyuman Joshi 2023년 4월 26일
"although I don't understand the difference between your first and second code. "
@Aleksandra Budzinska, they are the same code, Kevin just used two different inputs to show the result.
However, @Kevin Holly, this fails to include the negative sign for negative numbers -
output = 'Sucrose high-100';
numbers = str2double(extract(output, digitsPattern))
numbers = 100

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Characters and Strings에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by