Если вам нужны только цифры, вы можете использовать регулярное выражение, например следующее:
(\d+).*?(\d+).*?(\d+%)
Быстрый тест в PowerShell показывает, что он работает по крайней мере для ваших входных данных:
PS Home:\> function test ($re) {
>> $a -match $re; $Matches
>> $b -match $re; $Matches
>> }
>>
PS Home:\> $a = "Lo: 46°F. Hi: 67°F. Chance of precipitation: 20%"
PS Home:\> $b = "Niedrig: 46°F. Höchst: 67°F. Niederschlag %: 20%"
PS Home:\> test "(\d+).*?(\d+).*?(\d+%)"
True
Name Value
---- -----
3 20%
2 67
1 46
0 46°F. Hi: 67°F. Chance of precipitation: 20%
True
3 20%
2 67
1 46
0 46°F. Höchst: 67°F. Niederschlag %: 20%
Однако, это больше не будет работать, если любая локаль может использовать числа в строках описания.
Вы можете добавить другие ограничения, например, требовать двоеточия перед каждым совпадением:
: (\d+).*?: (\d+).*?: (\d+%)
Это должно касаться ложных чисел в других местах строки. Но в целом наилучшим способом было бы получить данные из источника, который предоставляет данные для машинного чтения, а не для потребления человеком