Stata将字符串分成几部分

时间:2015-01-24 16:21:16

标签: regex stata

我有一个字符串变量(col1),我希望在第一次出现整数时分割,即生成变量part1part2

               col1                part1    part2
--------------------------------------------------
    AufderScholle12        AufderScholle       12
Kˆnigsbr¸ckerPlatz3   Kˆnigsbr¸ckerPlatz        3
         Hansastr0A             Hansastr       0A
             Flur:3                Flur:        3

我无法弄清楚如何使用各种文章中的正则表达式来解决这个问题。

2 个答案:

答案 0 :(得分:3)

以下适用于您的示例数据,但请注意我必须插入"非传统"正则表达式定义中的字符因为我没有看到表达"除了数字之外的所有字符"使用Stata实现的正则表达式:

clear
set more off

*----- example data -----

input ///
str30 orig              
"AufderScholle12"       
"K^nigsbr¸ckerPlatz3"   
"Hansastr0A"          
"Flur:3"
end

list

*----- what you want -----

gen p1 = regexs(1) if(regexm(orig, "([\-\^\¸\:a-zA-Z]*)([0-9]?.*)"))
gen p2 = regexs(2) if(regexm(orig, "([\-\^\¸\:a-zA-Z]*)([0-9]?.*)"))

list

正则表达专家可以在这里看看Stata的实现(非常简单):

http://www.stata.com/support/faqs/data-management/regular-expressions/

检查更好的方法。

根据Stata的help regex

  

正则表达式语法基于Henry Spencer的NFA算法,   这几乎与POSIX.2标准相同。

我在使用字符串函数时更有信心的解决方案:

clear
set more off

*----- example data -----

input ///
str30 orig              
"AufderScholle12"       
"K^nigsbr¸ckerPlatz3"   
"Hansastr0A"          
"Flur:3"
end

list

*----- what you want -----

forvalues i = 0/9 {
    gen p_`i' = strpos(orig, "`i'")
    replace p_`i' = . if p_`i' == 0
}

egen fpos = rowmin(p*)

gen p1 = substr(orig, 1, fpos-1)
gen p2 = substr(orig, fpos, .)

drop fpos p_*
list

这只是找到第一个数字字符出现的位置,并使用它来从原始文本中挑出子字符串。

请参阅help string functions

修改

一种表达"除了数字之外的所有方式"是[^0-9]*,因此以下内容将与原始结果相同:

gen p3 = regexs(1) if(regexm(orig, "([^0-9]*)([0-9]?.*)"))
gen p4 = regexs(2) if(regexm(orig, "([^0-9]*)([0-9]?.*)"))

答案 1 :(得分:1)

这不是一个完整的答案,只是@Roberto Ferrer的有用答案的一个脚注,不能作为评论。

找到第一个整数位置的另一种方法,不创建10个新变量,然后启动egen

gen posint = . 
quietly forval i = 0/9 { 
    replace posint = min(posint, strpos(orig, "`i'")) 
}