从字符串中解析 ISIN
Parse ISIN out of String
我想从一个非常奇怪的字符串中解析出一个 ISIN,我的代码如下所示:
> df <- fread("C:/Users/WZHPCH/Desktop/Error Messages/df.csv", sep=";", stringsAsFactors=FALSE)
> dput(df)
structure(list(ID = c(1L, 2L, 4L, 2L, 3L, 24L), VAL = c("TES+XS0255015603+ae2s",
"TEST*XS0255015603+d2aasd", "safd*adf*XS0255015603++", "gasdfs*dsa*US0917971006",
"asdfsUS0917971006adf", "sd-asd-afds-US0917971006")), .Names = c("ID",
"VAL"), row.names = c(NA, -6L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x0000000000110788>)
> df$parsedISIN <- gsub("^[a-zA-Z]{2}[0-9]{10}$", '\1', df$VAL)
我对 gsub 做错了什么?
有什么推荐吗?
感谢您的回复!
您可以使用 str_extract
和一个好的 ISIN 正则表达式只提取 ISIN:
library(stringr)
VAL <- c("TES+XS0255015603+ae2s",
"TEST*XS0255015603+d2aasd", "safd*adf*XS0255015603++", "gasdfs*dsa*US0917971006",
"asdfsUS0917971006adf", "steve", "sd-asd-afds-US0917971006")
isin_pat <- "(BE|BM|FR|BG|VE|DK|HR|DE|JP|HU|HK|JO|BR|XS|FI|GR|IS|RU|LB|PT|NO|TW|UA|TR|LK|LV|LU|TH|NL|PK|PH|RO|EG|PL|AA|CH|CN|CL|EE|CA|IR|IT|ZA|CZ|CY|AR|AU|AT|IN|CS|CR|IE|ID|ES|PE|TN|PA|SG|IL|US|MX|SK|KR|SI|KW|MY|MO|SE|GB|GG|KY|JE|VG|NG|SA|MU)([0-9A-Z]{9})([0-9])"
str_extract(VAL, pat)
## [1] "XS0255015603" "XS0255015603" "XS0255015603" "US0917971006"
## [5] "US0917971006" NA "US0917971006"
(我在其中添加 "steve"
只是为了在它找不到任何东西时显示它 returns 的内容)。
ISIN 代码也会 need/should 进行验证(即校验位),除非您完全确定您将从提取中获得有效代码。
将其分配给数据框列:
df <- str_extract(VAL, pat)
基本上,如果您在 gsub
中进行替换,您需要在要隔离的组上加上括号:
> df
ID VAL
1: 1 TES+XS0255015603+ae2s
2: 2 TEST*XS0255015603+d2aasd
3: 4 safd*adf*XS0255015603++
4: 2 gasdfs*dsa*US0917971006
5: 3 asdfsUS0917971006adf
6: 24 sd-asd-afds-US0917971006
> df[,isin:=gsub(".*([A-Z]{2}[0-9]+).*","\1",VAL)]
> df
ID VAL isin
1: 1 TES+XS0255015603+ae2s XS0255015603
2: 2 TEST*XS0255015603+d2aasd XS0255015603
3: 4 safd*adf*XS0255015603++ XS0255015603
4: 2 gasdfs*dsa*US0917971006 US0917971006
5: 3 asdfsUS0917971006adf US0917971006
6: 24 sd-asd-afds-US0917971006 US0917971006
这里有几个问题:
1) 尽管问题使用了 dput
对象中有一个指针,因此它不能在其他系统上使用。我已经编辑了指针以提供:
df <-
structure(list(ID = c(1L, 2L, 4L, 2L, 3L, 24L), VAL = c("TES+XS0255015603+ae2s",
"TEST*XS0255015603+d2aasd", "safd*adf*XS0255015603++", "gasdfs*dsa*US0917971006",
"asdfsUS0917971006adf", "sd-asd-afds-US0917971006")), .Names = c("ID",
"VAL"), row.names = c(NA, -6L), class = c("data.table", "data.frame"))
2) 代码参考df.gem$Attributes
。应该是 df$VAL
.
3) gsub
应该是 sub
因为每个组件只出现一次。
4) 匹配仅当它从字符串的开头开始并在字符串的末尾结束时才匹配,但如果它在字符串内则不会匹配,这里就是这种情况。
5) 要使用sub,我们需要匹配所有的东西,只捕获我们需要的,这样我们就可以排除我们不需要的。
试试这个:
pat <- ".*([a-zA-Z]{2}[0-9]{10}).*"
sub(pat, "\1", df$VAL)
给出:
[1] "XS0255015603" "XS0255015603" "XS0255015603" "US0917971006" "US0917971006"
[6] "US0917971006"
这是正则表达式的可视化,pat
:
.*([a-zA-Z]{2}[0-9]{10}).*
注意: 稍微简单一点的方法是在 gsubfn 中使用 strapplyc
直接提取模式。在这种情况下,正则表达式会稍微简化:
library(gsubfn)
strapplyc(df$VAL, "[a-zA-Z]{2}[0-9]{10}", simplify = TRUE)
这是一个可视化:
[a-zA-Z]{2}[0-9]{10}
我想从一个非常奇怪的字符串中解析出一个 ISIN,我的代码如下所示:
> df <- fread("C:/Users/WZHPCH/Desktop/Error Messages/df.csv", sep=";", stringsAsFactors=FALSE)
> dput(df)
structure(list(ID = c(1L, 2L, 4L, 2L, 3L, 24L), VAL = c("TES+XS0255015603+ae2s",
"TEST*XS0255015603+d2aasd", "safd*adf*XS0255015603++", "gasdfs*dsa*US0917971006",
"asdfsUS0917971006adf", "sd-asd-afds-US0917971006")), .Names = c("ID",
"VAL"), row.names = c(NA, -6L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x0000000000110788>)
> df$parsedISIN <- gsub("^[a-zA-Z]{2}[0-9]{10}$", '\1', df$VAL)
我对 gsub 做错了什么?
有什么推荐吗?
感谢您的回复!
您可以使用 str_extract
和一个好的 ISIN 正则表达式只提取 ISIN:
library(stringr)
VAL <- c("TES+XS0255015603+ae2s",
"TEST*XS0255015603+d2aasd", "safd*adf*XS0255015603++", "gasdfs*dsa*US0917971006",
"asdfsUS0917971006adf", "steve", "sd-asd-afds-US0917971006")
isin_pat <- "(BE|BM|FR|BG|VE|DK|HR|DE|JP|HU|HK|JO|BR|XS|FI|GR|IS|RU|LB|PT|NO|TW|UA|TR|LK|LV|LU|TH|NL|PK|PH|RO|EG|PL|AA|CH|CN|CL|EE|CA|IR|IT|ZA|CZ|CY|AR|AU|AT|IN|CS|CR|IE|ID|ES|PE|TN|PA|SG|IL|US|MX|SK|KR|SI|KW|MY|MO|SE|GB|GG|KY|JE|VG|NG|SA|MU)([0-9A-Z]{9})([0-9])"
str_extract(VAL, pat)
## [1] "XS0255015603" "XS0255015603" "XS0255015603" "US0917971006"
## [5] "US0917971006" NA "US0917971006"
(我在其中添加 "steve"
只是为了在它找不到任何东西时显示它 returns 的内容)。
ISIN 代码也会 need/should 进行验证(即校验位),除非您完全确定您将从提取中获得有效代码。
将其分配给数据框列:
df <- str_extract(VAL, pat)
基本上,如果您在 gsub
中进行替换,您需要在要隔离的组上加上括号:
> df
ID VAL
1: 1 TES+XS0255015603+ae2s
2: 2 TEST*XS0255015603+d2aasd
3: 4 safd*adf*XS0255015603++
4: 2 gasdfs*dsa*US0917971006
5: 3 asdfsUS0917971006adf
6: 24 sd-asd-afds-US0917971006
> df[,isin:=gsub(".*([A-Z]{2}[0-9]+).*","\1",VAL)]
> df
ID VAL isin
1: 1 TES+XS0255015603+ae2s XS0255015603
2: 2 TEST*XS0255015603+d2aasd XS0255015603
3: 4 safd*adf*XS0255015603++ XS0255015603
4: 2 gasdfs*dsa*US0917971006 US0917971006
5: 3 asdfsUS0917971006adf US0917971006
6: 24 sd-asd-afds-US0917971006 US0917971006
这里有几个问题:
1) 尽管问题使用了 dput
对象中有一个指针,因此它不能在其他系统上使用。我已经编辑了指针以提供:
df <-
structure(list(ID = c(1L, 2L, 4L, 2L, 3L, 24L), VAL = c("TES+XS0255015603+ae2s",
"TEST*XS0255015603+d2aasd", "safd*adf*XS0255015603++", "gasdfs*dsa*US0917971006",
"asdfsUS0917971006adf", "sd-asd-afds-US0917971006")), .Names = c("ID",
"VAL"), row.names = c(NA, -6L), class = c("data.table", "data.frame"))
2) 代码参考df.gem$Attributes
。应该是 df$VAL
.
3) gsub
应该是 sub
因为每个组件只出现一次。
4) 匹配仅当它从字符串的开头开始并在字符串的末尾结束时才匹配,但如果它在字符串内则不会匹配,这里就是这种情况。
5) 要使用sub,我们需要匹配所有的东西,只捕获我们需要的,这样我们就可以排除我们不需要的。
试试这个:
pat <- ".*([a-zA-Z]{2}[0-9]{10}).*"
sub(pat, "\1", df$VAL)
给出:
[1] "XS0255015603" "XS0255015603" "XS0255015603" "US0917971006" "US0917971006"
[6] "US0917971006"
这是正则表达式的可视化,pat
:
.*([a-zA-Z]{2}[0-9]{10}).*
注意: 稍微简单一点的方法是在 gsubfn 中使用 strapplyc
直接提取模式。在这种情况下,正则表达式会稍微简化:
library(gsubfn)
strapplyc(df$VAL, "[a-zA-Z]{2}[0-9]{10}", simplify = TRUE)
这是一个可视化:
[a-zA-Z]{2}[0-9]{10}