R "eats" 部分字符串中的正则表达式
regex in R "eats" part of the string
我想将一个字符串分成两组。字符串的结构很简单,但我还没能实现它。
txt <- "text12-01-2016"
它总是一些字母,后面跟着一个日期,而日期显然以数字开头。我在 https://regex101.com/ 处尝试了以下正则表达式并有效地正确分隔了字符串:
([a-zA-Z]*)([0-9].*)
1. "text"
2. "12-01-2016"
但是当我在 R 中尝试时它失败了:
strsplit(a[1],split = "([a-zA-Z]*)([0-9]*)")
[[1]]
[1] "" " " "" "." " " "" " " "" "-" "" "-" ""
如果我引入双方括号,那么它 "eats" 输出第一组的最后一个字符,以及第二组的第一个字符:
strsplit(txt,split = "([[a-zA-Z]]*)([[0-9]]*)")
[[1]]
[1] "tex" "2-01-2016"
我用perl=TRUE
没关系。如果我使用 stringi::stri_split
,结果也是一致的,所以这是我的正则表达式中的问题。
在这种情况下,正确的正则表达式是什么?
这里的"problem"是你有一个正则表达式用于匹配,而不是用于拆分。
您可以将 following PCRE regex 与 strsplit
一起使用:
strsplit(txt,split = "(?<=[a-zA-Z])(?=[0-9])", perl=T)
[[1]]
[1] "text" "12-01-2016"
正则表达式将匹配字母和数字之间的位置,strsplit 将拆分结果。如果需要,您可以进一步取消列出它。
如果您想使用正则表达式,请使用 stringr
中的 str_match
:
> library(stringr)
>str_match(txt, "([a-zA-Z]*)([0-9].*)")
[,1] [,2] [,3]
[1,] "text12-01-2016" "text" "12-01-2016"
我想将一个字符串分成两组。字符串的结构很简单,但我还没能实现它。
txt <- "text12-01-2016"
它总是一些字母,后面跟着一个日期,而日期显然以数字开头。我在 https://regex101.com/ 处尝试了以下正则表达式并有效地正确分隔了字符串:
([a-zA-Z]*)([0-9].*)
1. "text"
2. "12-01-2016"
但是当我在 R 中尝试时它失败了:
strsplit(a[1],split = "([a-zA-Z]*)([0-9]*)")
[[1]]
[1] "" " " "" "." " " "" " " "" "-" "" "-" ""
如果我引入双方括号,那么它 "eats" 输出第一组的最后一个字符,以及第二组的第一个字符:
strsplit(txt,split = "([[a-zA-Z]]*)([[0-9]]*)")
[[1]]
[1] "tex" "2-01-2016"
我用perl=TRUE
没关系。如果我使用 stringi::stri_split
,结果也是一致的,所以这是我的正则表达式中的问题。
在这种情况下,正确的正则表达式是什么?
这里的"problem"是你有一个正则表达式用于匹配,而不是用于拆分。
您可以将 following PCRE regex 与 strsplit
一起使用:
strsplit(txt,split = "(?<=[a-zA-Z])(?=[0-9])", perl=T)
[[1]]
[1] "text" "12-01-2016"
正则表达式将匹配字母和数字之间的位置,strsplit 将拆分结果。如果需要,您可以进一步取消列出它。
如果您想使用正则表达式,请使用 stringr
中的 str_match
:
> library(stringr)
>str_match(txt, "([a-zA-Z]*)([0-9].*)")
[,1] [,2] [,3]
[1,] "text12-01-2016" "text" "12-01-2016"