2016-07-15 479 views
0

我正在使用stata,並且有一個名爲「practice」的變量,它有一個實踐列表和它們在括號內的5個字符代碼。在Stata中提取正則表達式(正則表達式)

我想僅將代碼部分提取到新變量中。下面是例子的什麼變量「實踐」中的數據是這樣的:

practice 1 name (JRX76) 
practice 2 name but longer (XN6S1) 
practice 3 name (4NB87) 
practice 4 name but longer (north) (RS236) 
practice 5 name (WSZ92) 

我用下面的代碼至今:

gen code=regexs(2) if regexm(practice, "(\()+([a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9])") 

其中按照格式完美的作品,除了數據上面的「練習4」,它提取「北」而不是「RS236」。

我試過玩過$符號,但沒有成功。

我還沒有制定出如何「如果」與regexs語句組合,沿邏輯線 「如果你發現2‘(’,在第二個‘(’後的5個字符表情」。

會有人能夠指出我在正確的方向上本嗎?

+1

不是問題,但我注意到,在你的例子中,所需的代碼只是字符串值中的最後一個「單詞」(在函數'word()'的意義上(剝去圓括號很容易)。 –

+0

跟隨@NickCox的觀察 - 基於你的例子,所需的子字符串總是字符串中的最後一個單詞,並且總是5個字符長希望避免使用正則表達式的任何人都可以縮短'substr(word(practice, -1),2,5)' – ander2ed

回答

1

我猜你忘了採取尾隨括號考慮當你試圖添加了「結束串」 $符號。爲了保持它儘可能接近你目前的正則表達式,我建議這個:

(\()+([a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9])(\))+$ 

現在有一些改進,我建議:

  • 沒有必要,如果他們出現正好一次使用「至少一次」 +量詞周圍的括號
  • 沒有必要添加各地
  • 如果Stata支持lookarounds括號一組,他們可以簡化代碼
  • 不要重複自己:使用量詞

所以,你可以嘗試使用這一個與lookarounds:

(?<=\()[a-zA-Z0-9]{5}(?=\)$) 

或者這一個無:

\(([a-zA-Z0-9]{5})\)$ 
+0

啊,在'$'之前也沒有放入'+'。這確實完成了這項工作!非常感謝! –

1

你並不需要捕獲括號:

([a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9])(?=\)$) 

我刪除開始模式(\()+並將(?=\)$)添加到末尾,這意味着要查找即將到來的文字)在行末。