Отдельные числа и слова в строке


У меня есть строковая переменная в Stata, которая содержит такие записи, как:

110xyz 43 abc 
110xyz 44 abc
111 xyz 56 abc
Ключ заключается в том, что иногда первый набор чисел (от 1 до 5 цифр длиной) не сопровождается пробелом перед началом следующего слова (и это может быть что угодно от 1 до 50 букв длиной). Есть ли аккуратный способ вставить пробел, чтобы отделить число и слово? (110 xyz был бы желаемый результат в приведенном выше примере) я попробовал regexr(), но это не помогает.
2 2

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 |
     +------------------------------------------------------------+