使用正则表达式标识unicode块

时间:2016-02-28 03:22:04

标签: regex stata

我有一个与我要导入Stata的xlsx个文件对应的路径列表:

     +--------------------------------------------------------------------+
     |                                                               path |
     |--------------------------------------------------------------------|
  1. |                              G:\Data_backup\Soufang_data\house.dta |
  2. |                        G:\Data_backup\Soufang_data\import_data.log |
  3. |                G:\Data_backup\Soufang_data/哈尔滨\哈尔滨_house.txt  |
  4. |                 G:\Data_backup\Soufang_data/哈尔滨\哈尔滨_land.txt  |
  5. |             G:\Data_backup\Soufang_data/哈尔滨/house\0_银泰城.xlsx  |
     |--------------------------------------------------------------------|
  6. |      G:\Data_backup\Soufang_data/哈尔滨/house\1000_芦家街住宅.xlsx  |
  7. |        G:\Data_backup\Soufang_data/哈尔滨/house\1001_国泰小区.xlsx  |
  8. | G:\Data_backup\Soufang_data/哈尔滨/house\1002_花园街193号小区.xlsx  |
  9. |        G:\Data_backup\Soufang_data/哈尔滨/house\1003_中发郦苑.xlsx  |
 10. |        G:\Data_backup\Soufang_data/哈尔滨/house\1004_荣耀宝座.xlsx  |
     +--------------------------------------------------------------------+

此外,每个路径都包含一个不确定的Unicode表达式(中文字符),它实际上是一个城市名称( 第一个>,例如" 哈尔滨&# 34;在这种情况下)。

我想使用类似regexr的函数提取此Unicode字符串。

我该如何编写代码?

4 个答案:

答案 0 :(得分:3)

使用此模式匹配中文字符:

[\u4e00-\u9fa5]+

如果有第一场比赛,只参加第一场比赛。 Please check out this demo

答案 1 :(得分:2)

试试这个:

[^\w^\:\\\/]+

https://regex101.com/r/bC2oR0/1

希望这有帮助。

答案 2 :(得分:2)

Stata的优秀常见问题解答还没有完全赶上版本14中引入的正则表达式函数的新Unicode版本。这些版本基于ICU正则表达式引擎。您提到的旧版regexr()仅用于纯ASCII,如帮助文件中所述(请参阅help f_regexm)。您可以了解有关两组函数here之间差异的更多信息。

如果我理解你的问题,我想要的是:

gen city_name = ustrregexs(0) if ustrregexm(path,"[\u4e00-\u9fa5]+")==1

从最后开始,最后的if语句将限制为具有一个或多个相关Unicode字符的路径,ustrregexs(0)中的0告诉Stata返回满足正则表达式的整个字符串。之前的ustrregexm()匹配。

答案 3 :(得分:1)

如果xlsx文件的路径结构始终相同,您也可以使用substr()strpos()strrpos()函数的组合:

clear

input strL string
"G:\Data_backup\Soufang_data/哈尔滨/house\0_银泰城.xlsx"
"G:\Data_backup\Soufang_data/哈尔滨/house\1000_芦家街住宅.xlsx"
"G:\Data_backup\Soufang_data/哈尔滨/house\1001_国泰小区.xlsx"
"G:\Data_backup\Soufang_data/哈尔滨/house\1002_花园街193号小区.xlsx"
"G:\Data_backup\Soufang_data/哈尔滨/house\1003_中发郦苑.xlsx"
"G:\Data_backup\Soufang_data/哈尔滨/house\1004_荣耀宝座.xlsx"
end

generate new_string = substr(string, strpos(string, "/") + 1, abs(strpos(string, "/") - ///
                      strrpos(string, "/")) - 1)

list

     +-------------------------------------------------------------------------------+
     |                                                             string   new_st~g |
     |-------------------------------------------------------------------------------|
  1. |             G:\Data_backup\Soufang_data/哈尔滨/house\0_银泰城.xlsx       哈尔滨 |
  2. |      G:\Data_backup\Soufang_data/哈尔滨/house\1000_芦家街住宅.xlsx       哈尔滨 |
  3. |        G:\Data_backup\Soufang_data/哈尔滨/house\1001_国泰小区.xlsx       哈尔滨 |
  4. | G:\Data_backup\Soufang_data/哈尔滨/house\1002_花园街193号小区.xlsx       哈尔滨 |
  5. |        G:\Data_backup\Soufang_data/哈尔滨/house\1003_中发郦苑.xlsx       哈尔滨 |
     |-------------------------------------------------------------------------------|
  6. |        G:\Data_backup\Soufang_data/哈尔滨/house\1004_荣耀宝座.xlsx       哈尔滨 |
     +-------------------------------------------------------------------------------+