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

How to remove everything but certain words in string variable (Stata)?

我有一个字符串变量 response,其中包含文本以及已经编码的类别(类别如“CatPlease”、“CatThanks”、“ExcuseMe”、“Apology”、“Mit” , ETC。)。 我想删除 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'")

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

我不认为自己能熟练使用 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 |
     +-------------------------+
* 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 |
     +-------------------------------------------------------------------------------+

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

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

这使用交替(编码为 | 的正则表达式 OR)来匹配 trailing/leading spaces,前导 space 在整个输入是目标词之一。