2016-02-21 7 views
2

У меня есть строковой переменной в Stata, которая содержит такие элементы, как:Отдельные цифры и слова в строке

110xyz 43 abc 
110xyz 44 abc 
111 xyz 56 abc 

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

+0

"не помогает" непрозрачен как отчет об ошибке. Всегда говорите точно, что вы пробовали, и почему это неудовлетворительно. –

ответ

3

Что пошло не так с 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() не совпадают.

+1

Спасибо, что сделал трюк. Вы были правы, только у меня были проблемы с регулярными выражениями. – JBDonges

+1

Упрощенный в одну строку, как предложил Эндрю: 'replace string = regexr (s,"^[0-9] * ", regexs (1) +" "), если regexm (s,"^([0-9] *) [^ 0-9] ")' –

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^