如何删除字符串变量(Stata)中除某些单词之外的所有内容?

时间:2020-12-31 22:24:21

标签: regex stata

我有一个字符串变量 response,它包含文本以及已经编码的类别(“CatPlease”、“CatThanks”、“ExcuseMe”、“Apology”、“Mit”等类别) .) 我想删除 response 除了这些以前编码的类别中的所有内容。

例如,我希望将 response 更改为:

"I Mit understand CatPlease read it again CatThanks"

到:

"Mit CatPlease CatThanks"

这似乎是一个简单的问题,但我无法让我的正则表达式代码完美运行。 下面的代码尝试将类别存储在变量 cat_only 中。它在类别出现在 response 的开头时才有效。本地宏 cats 包含我想在 response 中保留的所有单词:

local cats = "(CatPlease|CatThanks|ExcuseMe|Apology|Mit|IThink|DK|Confused|Offers|CatYG)?"

gen cat_only = strltrim(strtrim(ustrregexs(1)+" "+ustrregexs(2)+" "+ustrregexs(3))) if ustrregexm(response, "`cats'.+?`cats'.+?`cats'")

如果我在 ustrregexm 中的搜索模式的开头添加字符,那么 cat_only 中将不会存储任何内容:

gen cat_only = strltrim(strtrim(ustrregexs(1)+" "+ustrregexs(2)+" "+ustrregexs(3))) if ustrregexm(response, ".+?`cats'.+?`cats'.+?`cats'")

有没有办法修复我的代码以使其正常工作,或者我应该以不同的方式解决问题?

3 个答案:

答案 0 :(得分:2)

我不认为自己精通 Stata 的正则表达式函数,但这可能会有所帮助:

. clear 

. set obs 1 
number of observations (_N) was 0, now 1

. gen test = "I Mit understand CatPlease read it again CatThanks"

. local OK "(CatPlease|CatThanks|ExcuseMe|Apology|Mit|IThink|DK|Confused|Offers|CatYG)"

. ssc install moss
. moss test, match("`OK'") regex 

. egen wanted = concat(_match*), p(" ")

. l wanted

     +-------------------------+
     |                  wanted |
     |-------------------------|
  1. | Mit CatPlease CatThanks |
     +-------------------------+

答案 1 :(得分:2)

* Example generated by -dataex-. To install: ssc install dataex
clear
input str50 response
"I Mit understand CatPlease read it again CatThanks"
end

local regex "(?!CatPlease|CatThanks|ExcuseMe|Apology|Mit|IThink|DK|Confused|Offers|CatYG)\b[^\s]+\b"
gen wanted = strtrim(stritrim(ustrregexra(response, "`regex'", "")))
list
. list

     +-------------------------------------------------------------------------------+
     |                                           response                     wanted |
     |-------------------------------------------------------------------------------|
  1. | I Mit understand CatPlease read it again CatThanks    Mit CatPlease CatThanks |
     +-------------------------------------------------------------------------------+

答案 2 :(得分:1)

可以使用正则表达式处理空格:

local words = "(?!CatPlease|CatThanks|ExcuseMe|Apology|Mit|IThink|DK|Confused|Offers|CatYG)\b\S+\b"
gen wanted = ustrregexra(response, "`words' | ?`words'", "")

这使用交替(编码为 | 的正则表达式 OR)来匹配尾随/前导空格,当整个输入是目标词之一时,前导空格是可选的。

相关问题