Отдельные числа и слова в строке
У меня есть строковая переменная в Stata, которая содержит такие записи, как:
110xyz 43 abc
110xyz 44 abc
111 xyz 56 abc
Ключ заключается в том, что иногда первый набор чисел (от 1 до 5 цифр длиной) не сопровождается пробелом перед началом следующего слова (и это может быть что угодно от 1 до 50 букв длиной). Есть ли аккуратный способ вставить пробел, чтобы отделить число и слово? (110 xyz
был бы желаемый результат в приведенном выше примере) я попробовал regexr()
, но это не помогает.2 ответа:
Что пошло не так с
regexr()
? Похоже, это именно тот инструмент, который нужно использовать, поэтому, возможно, у вас возникли проблемы с регулярными выражениями.Мой синтаксис Stata может быть немного не таким, но попробуйте что-то вроде этого:
gen string = "110xyz 43 abc" gen number = regexs(1) if regexm(string, "^([0-9]+) *([a-zA-Z].*)") gen remain = regexs(2) if regexm(string, "^([0-9]+) *([a-zA-Z].*)") gen fixed = number + " " + remain
Это можно упростить, но я начинаю с того, что, по моему мнению, имеет самую высокую вероятность работы, например, гарантированное совпадение, потому что я не знаю, какие результаты нулевого значения, если
regexm()
не совпадают.
moss
от SSC предлагает удобную обертку для функций регулярных выражений Stata. Демонстрация:clear input str16 test "110xyz 43 abc" "110xyz 44 abc" "111 xyz 56 abc" end ssc inst moss help moss moss test, match("([0-9]+)") regex pre(num) moss test, match("([a-z]+)") regex pre(word) list test *match* +------------------------------------------------------------+ | test nummat~1 nummat~2 wordma~1 wordma~2 | |------------------------------------------------------------| 1. | 110xyz 43 abc 110 43 xyz abc | 2. | 110xyz 44 abc 110 44 xyz abc | 3. | 111 xyz 56 abc 111 56 xyz abc | +------------------------------------------------------------+