stata命令詳解-函數regexm/regexr/regexs

1. 前言

在目前工作中,用stata清洗及分析數據,感覺很順滑。無奈不少同學因為help文件里的英文望而卻步。

帶著學習和分享的目的,根據工作經驗,給大家整理一些常用以及不太常用但很有用的命令,并對該命令的help文件進行有側重的詳解。

2. 描述

regexm(s,re):字符串函數。字符串匹配函數。當字符串s符合正則表達式re時,返回1,否則返回0.

regexr(s1,re,s2):字符串函數。字符串替換函數。將符合正則表達式re的字符串s1中的第一個子字符串替換未字符串s2,并返回替換后的結果字符串。

  • 當字符串s1中不包括符合正則表達式re的子字符串時,返回字符串s1。

regexs(n):字符串函數。與regexr結合使用。返回regexm(s,re)第n個子表達式對應的子字符串。如果n=0,則表示返回所有符合正則表達式的字符串。

3. 參數

  • regexm(s,re)

s:ASCII碼的字符串

re:正則表達式

  • regexr(s1,re,s2)

s1:ASCII碼的字符串

re:正則表達式

s2:ASCII碼的字符串

  • regexs(n)

n:取值范圍:0 ≤ n < 10

4. 舉例

*調入自帶數據auto
sysuse auto
*列出變量make中以B字母開頭的數據
generate bbegin = regexm(make, "^B")
list make if bbegin == 1
*同上
list make if regexm(make, "^B") == 1
bbegin.png
*列出變量中包含ck字符串的數據
list make if regexm(make, "ck") == 1
ck.png
*列出變量make中以數字結尾的數據
list make if regexm(make, "[0-9]$") == 1
digit.png
*生成新變量make2(通過復制變量make)
generate make2 = make
*將變量make2中以B字母開頭,3個數字+小寫字母結尾的數據替換成found
replace make2 = regexr(make2, "^B.*[0-9][0-9][0-9][a-z]$", "found")
*將變量make和make2不一樣的兩個變量顯示出來
list make make2 if make != make2
make2.png
*清除內存數據
clear
*輸入變量number
input str15 number
                         number
             1. "(123) 456-7890"
             2. "(800) STATAPC"
             3. end
*將變量number中的(123) 456-7890轉為123-456-7890形式,其中,regexs(1)表示符合第1個子表達式[0-9]+,即括號中的數字的字符串;regexs(2)表示符合第2個子表達式.*,即)后的所有內容。
gen str newnum = regexs(1) + "-" + regexs(2) if regexm(number,"^\(([0-9]+)\) (.*)")
*列出變量number和newnum
l number newnum
number.png

5.補充

  • 上述例子中涉及正則表達式(regular expression)中的元字符
元字符 含義 舉例
\ 后向引用,后面跟正則表達式中的某個元字符,表示匹配該符號。類似于轉義。 \\匹配\;\-匹配-。
^ 在表達式的開頭位置,表示接下來的表達式所要匹配的內容位于字符串的開始的位置。 ^B表示以B開頭;^\(表示以(開頭
$ 在表達式的結尾位置,表示錢買你的表達式所要匹配的內容位于字符串結尾的位置。 [0-9]$表示以數字結尾
* 表示將前一個字符或子表達式匹配任意次數,可以為0次。 XY*可以匹配X,也可以匹配XY,XYY,XY.....Y。
+ 表示將前一個字符或子表達式匹配至少1次。 XY+可匹配XY,XYY,XY.....Y,但不可匹配X。
? 表示將前一個字符或子表達式匹配0次或1次。 XY?可匹配XXY
{n} n為一個非負整數,表示將前一個字符或子表達式匹配n次。 XY{2}匹配XYY;只能用于以ustr開頭的4個正則表達式的字符串函數中
. 表示可以匹配任意字符 .*可以匹配任意字符或者不匹配任何字符。
() 創建一個子表達式,可以提取或者替換括號內的子表達式對應的字符串 ^\(([0-9]+)\) (.*)可拆成^,\(,([0-9]+),\),(.*),其中,([0-9]+),(.*)為子表達式
- 指定一個范圍 a-z:字母a到字母z范圍的小寫字母;A-Z:字母A到字母Z范圍的大寫字母;0-9:數值0-9范圍內的數字。
[] 方括號內的字符之一被用來進行匹配 [a-z]可以匹配a-z范圍內的任意小寫字母

來源:http://www.360doc.com/content/16/1223/13/39103730_617058825.shtml

  • 序列
正則表達式 含義
\d 匹配數字字符
\D 匹配非數字字符
\s 匹配間隔符(空格)
\S 匹配非間隔符(非空格)
\w 匹配單詞字符
\W 匹配非單詞字符
\b 匹配詞界
\B 匹配非詞界

來源:https://blog.csdn.net/arlionn/article/details/85156842

  • 常用正則表達式
正則表達式 含義
[\u4e00-\u9fa5] 匹配中文字符
[^\x00-\xff] 匹配雙字節字符(包括漢字在內)
\n\s*\r 匹配空白行
<(\S*?)[^>]*>.*?</\1>|<.*? /> 匹配HTML標記
^\s*|\s*$ 匹配首尾空白字符
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 匹配Email地址
[a-zA-z]+://[^\s]* 匹配網址URL
^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線)
\d{3}-\d{8}|\d{4}-\d{7} 匹配國內電話號碼
[1-9][0-9]{4,} 匹配騰訊QQ號(騰訊QQ號從10000開始)
[1-9]\d{5}(?!\d) 匹配中國郵政編碼(中國郵政編碼為6位數字)
\d{15}|\d{18} 匹配身份證(中國的身份證為15位或18位)
\d+\.\d+\.\d+\.\d+ 匹配ip地址

來源:https://blog.csdn.net/wangjia55/article/details/7877915

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Python中的正則表達式(re) import rere.match #從開始位置開始匹配,如果開頭沒有則無re...
    BigJeffWang閱讀 7,142評論 0 99
  • Day 17 補充 重載:函數的重載 -- 函數名相同但是參數不同的函數可以有多個,但是python不支持函數...
    曉曉_007f閱讀 358評論 0 1
  • 搞懂Python 正則表達式用法 Python 正則表達式 正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一...
    廈熱閱讀 1,615評論 0 2
  • 正則表達式到底是什么東西?字符是計算機軟件處理文字時最基本的單位,可能是字母,數字,標點符號,空格,換行符,漢字等...
    獅子挽歌閱讀 2,169評論 0 9
  • 陽光明媚的一天,教學樓的周圍醒目的張貼著一條條關于考研的條幅,不由得使得周圍的空氣開始凝結起來。有點沉重,有點壓抑...
    程婭婭閱讀 464評論 0 2