How to extract positive, negative and fraction numbers from string?
28 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
How do I extract numbers from a string where the number can be positive, negative or even fractions?
I tried the following but it is not getting the fractions. Thanks.
B = str2double(regexp(str,'[+-]?\d+','match'));
4 commentaires
Stephen23
le 9 Mar 2022
See also comment from @Nadatimuj here: https://www.mathworks.com/matlabcentral/answers/406543-how-to-extract-only-floating-numbers-from-a-string#comment_2028794
The answer there also answers this question.
Réponse acceptée
Walter Roberson
le 9 Mar 2022
Copying to an Answer... turns out that in context the solution was a bit easier than was originally asked about.
S = '{(0, 0): -8, (0, 1): 2, (0, 2): 2, (0, 3): 2, (0, 4): 2, (0, 5): 2, (0, 6): 2, (0, 7): 2, (0, 8): 4, (0, 9): 8, (1, 1): -12, (1, 2): 2, (1, 3): 2, (1, 4): 2, (1, 5): 2, (1, 6): 2, (1, 7): 2, (1, 8): 4, (1, 9): 8, (2, 2): -10, (2, 3): 2, (2, 4): 2, (2, 5): 2, (2, 6): 2, (2, 7): 2, (2, 8): 4, (2, 9): 8, (3, 3): -8, (3, 4): 2, (3, 5): 2, (3, 6): 2, (3, 7): 2, (3, 8): 4, (3, 9): 8, (4, 4): -8, (4, 5): 2, (4, 6): 2, (4, 7): 2, (4, 8): 4, (4, 9): 8, (5, 5): -10, (5, 6): 2, (5, 7): 2, (5, 8): 4, (5, 9): 8, (6, 6): -8, (6, 7): 2, (6, 8): 4, (6, 9): 8, (7, 7): -9, (8, 8): -16, (9, 9): -24, (7, 8): 4, (7, 9): 8, (8, 9): 16, (10, 10): 58.0, (0, 10): -2, (1, 11): 2, (11, 11): 56.0, (2, 12): 2, (12, 12): 56.0, (13, 13): 58.0, (3, 13): -2, (14, 14): 58.0, (4, 14): -2, (15, 15): 58.0, (5, 15): -2, (16, 16): 58.0, (6, 16): -2, (17, 17): -55.0, (17, 18): 4, (17, 19): 8, (17, 20): 16, (17, 21): 32, (17, 22): 64, (10, 17): -2, (11, 17): -2, (12, 17): -2, (13, 17): -2, (14, 17): -2, (15, 17): -2, (16, 17): -2, (18, 18): -108.0, (18, 19): 16, (18, 20): 32, (18, 21): 64, (18, 22): 128, (10, 18): -4, (11, 18): -4, (12, 18): -4, (13, 18): -4, (14, 18): -4, (15, 18): -4, (16, 18): -4, (19, 19): -208.0, (19, 20): 64, (19, 21): 128, (19, 22): 256, (10, 19): -8, (11, 19): -8, (12, 19): -8, (13, 19): -8, (14, 19): -8, (15, 19): -8, (16, 19): -8, (20, 20): -384.0, (20, 21): 256, (20, 22): 512, (10, 20): -16, (11, 20): -16, (12, 20): -16, (13, 20): -16, (14, 20): -16, (15, 20): -16, (16, 20): -16, (21, 21): -640.0, (21, 22): 1024, (10, 21): -32, (11, 21): -32, (12, 21): -32, (13, 21): -32, (14, 21): -32, (15, 21): -32, (16, 21): -32, (22, 22): -771.0, (10, 22): -64, (11, 22): -64, (12, 22): -64, (13, 22): -64, (14, 22): -64, (15, 22): -64, (16, 22): -64, (10, 11): 2, (10, 12): 2, (10, 13): 2, (10, 14): 2, (10, 15): 2, (10, 16): 2, (11, 12): 2, (11, 13): 2, (11, 14): 2, (11, 15): 2, (11, 16): 2, (12, 13): 2, (12, 14): 2, (12, 15): 2, (12, 16): 2, (13, 14): 2, (13, 15): 2, (13, 16): 2, (14, 15): 2, (14, 16): 2, (15, 16): 2, (23, 23): 60.0, (0, 23): -2, (1, 24): 2, (24, 24): 58.0, (2, 25): 2, (25, 25): 58.0, (26, 26): 60.0, (3, 26): -2, (4, 27): 2, (27, 27): 58.0, (5, 28): 2, (28, 28): 58.0, (29, 29): 60.0, (6, 29): -2, (30, 30): -57.0, (30, 31): 4, (30, 32): 8, (30, 33): 16, (30, 34): 32, (30, 35): 64, (23, 30): -2, (24, 30): -2, (25, 30): -2, (26, 30): -2, (27, 30): -2, (28, 30): -2, (29, 30): -2, (31, 31): -112.0, (31, 32): 16, (31, 33): 32, (31, 34): 64, (31, 35): 128, (23, 31): -4, (24, 31): -4, (25, 31): -4, (26, 31): -4, (27, 31): -4, (28, 31): -4, (29, 31): -4, (32, 32): -216.0, (32, 33): 64, (32, 34): 128, (32, 35): 256, (23, 32): -8, (24, 32): -8, (25, 32): -8, (26, 32): -8, (27, 32): -8, (28, 32): -8, (29, 32): -8, (33, 33): -400.0, (33, 34): 256, (33, 35): 512, (23, 33): -16, (24, 33): -16, (25, 33): -16, (26, 33): -16, (27, 33): -16, (28, 33): -16, (29, 33): -16, (34, 34): -672.0, (34, 35): 1024, (23, 34): -32, (24, 34): -32, (25, 34): -32, (26, 34): -32, (27, 34): -32, (28, 34): -32, (29, 34): -32, (35, 35): -829.0, (23, 35): -64, (24, 35): -64, (25, 35): -64, (26, 35): -64, (27, 35): -64, (28, 35): -64, (29, 35): -64, (23, 24): 2, (23, 25): 2, (23, 26): 2, (23, 27): 2, (23, 28): 2, (23, 29): 2, (24, 25): 2, (24, 26): 2, (24, 27): 2, (24, 28): 2, (24, 29): 2, (25, 26): 2, (25, 27): 2, (25, 28): 2, (25, 29): 2, (26, 27): 2, (26, 28): 2, (26, 29): 2, (27, 28): 2, (27, 29): 2, (28, 29): 2, (0, 36): 2, (36, 36): 54.0, (1, 37): 2, (37, 37): 54.0, (38, 38): 56.0, (2, 38): -2, (3, 39): 2, (39, 39): 54.0, (40, 40): 56.0, (4, 40): -2, (5, 41): 2, (41, 41): 54.0, (6, 42): 2, (42, 42): 54.0, (43, 43): -53.0, (43, 44): 4, (43, 45): 8, (43, 46): 16, (43, 47): 32, (43, 48): 64, (36, 43): -2, (37, 43): -2, (38, 43): -2, (39, 43): -2, (40, 43): -2, (41, 43): -2, (42, 43): -2, (44, 44): -104.0, (44, 45): 16, (44, 46): 32, (44, 47): 64, (44, 48): 128, (36, 44): -4, (37, 44): -4, (38, 44): -4, (39, 44): -4, (40, 44): -4, (41, 44): -4, (42, 44): -4, (45, 45): -200.0, (45, 46): 64, (45, 47): 128, (45, 48): 256, (36, 45): -8, (37, 45): -8, (38, 45): -8, (39, 45): -8, (40, 45): -8, (41, 45): -8, (42, 45): -8, (46, 46): -368.0, (46, 47): 256, (46, 48): 512, (36, 46): -16, (37, 46): -16, (38, 46): -16, (39, 46): -16, (40, 46): -16, (41, 46): -16, (42, 46): -16, (47, 47): -608.0, (47, 48): 1024, (36, 47): -32, (37, 47): -32, (38, 47): -32, (39, 47): -32, (40, 47): -32, (41, 47): -32, (42, 47): -32, (48, 48): -703.0, (36, 48): -64, (37, 48): -64, (38, 48): -64, (39, 48): -64, (40, 48): -64, (41, 48): -64, (42, 48): -64, (36, 37): 2, (36, 38): 2, (36, 39): 2, (36, 40): 2, (36, 41): 2, (36, 42): 2, (37, 38): 2, (37, 39): 2, (37, 40): 2, (37, 41): 2, (37, 42): 2, (38, 39): 2, (38, 40): 2, (38, 41): 2, (38, 42): 2, (39, 40): 2, (39, 41): 2, (39, 42): 2, (40, 41): 2, (40, 42): 2, (41, 42): 2, (22, 49): 2, (50, 50): 2, (35, 50): -2, (48, 51): 2, (52, 52): 1, (52, 53): 4, (49, 52): -2, (50, 52): -2, (51, 52): -2, (53, 53): 5, (49, 53): -4, (50, 53): -4, (51, 53): -4, (49, 50): 2, (49, 51): 2, (50, 51): 2, (22, 54): 2, (55, 55): 2, (35, 55): -2, (56, 56): 2, (48, 56): -2, (57, 57): 1, (57, 58): 4, (54, 57): -2, (55, 57): -2, (56, 57): -2, (58, 58): 3, (54, 58): -4, (55, 58): -4, (56, 58): -4, (54, 55): 2, (54, 56): 2, (55, 56): 2, (22, 59): 2, (60, 60): 2, (35, 60): -2, (61, 61): 2, (48, 61): -2, (62, 62): 1, (62, 63): 4, (59, 62): -2, (60, 62): -2, (61, 62): -2, (63, 63): 5, (59, 63): -4, (60, 63): -4, (61, 63): -4, (59, 60): 2, (59, 61): 2, (60, 61): 2, (64, 64): 2, (53, 64): -2, (58, 65): 2, (66, 66): 2, (63, 66): -2, (67, 67): 1, (64, 67): -2, (65, 67): -2, (66, 67): -2, (64, 65): 2, (64, 66): 2, (65, 66): 2}'
parts = regexp(S, '(?<c1>\d+),\s+(?<c2>\d+)\):\s+(?<val>[^,\}]+)', 'names')
all_c1 = str2double({parts.c1})
all_c2 = str2double({parts.c2})
all_val = str2double({parts.val})
0 commentaires
Plus de réponses (1)
DGM
le 9 Mar 2022
Since it was never clarified, I'm going to ignore sci/eng notation:
str = '+100 -100 100 100.1 100.001 1.001 .001 100.';
B = str2double(regexp(str,'[+-]?(\d*\.)?\d+','match'))
Note how this will behave on things which are not decimal expressions:
str = '11.22.33.44.55';
B = str2double(regexp(str,'[+-]?(\d*\.)?\d+','match'))
I'm sure it can be more robust, but it's a start.
12 commentaires
DGM
le 9 Mar 2022
I didn't even think of using an OR.
From a beginner's perspective, regex feels like a swiss army knife with so many blades that you end up just using the knife blade as a screwdriver because you can't remember which one was the screwdriver blade.
Voir également
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!