我有一个字符串变量 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'")
有没有办法修复我的代码以使其正常工作,或者我应该以不同的方式解决问题?
答案 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)来匹配尾随/前导空格,当整个输入是目标词之一时,前导空格是可选的。