我有一个字符串变量(col1
),我希望在第一次出现整数时分割,即生成变量part1
和part2
。
col1 part1 part2
--------------------------------------------------
AufderScholle12 AufderScholle 12
Kˆnigsbr¸ckerPlatz3 Kˆnigsbr¸ckerPlatz 3
Hansastr0A Hansastr 0A
Flur:3 Flur: 3
我无法弄清楚如何使用各种文章中的正则表达式来解决这个问题。
答案 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'"))
}