如何删除字符串变量(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 在整个输入是目标词之一。
我有一个字符串变量 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 在整个输入是目标词之一。