我有一个包含页面路径的数据框列:
pagePath
/text/other_text/123-some_other_txet-4571/text.html
/text/other_text/another_txet/15-some_other_txet.html
/text/other_text/25189-some_other_txet/45112-text.html
/text/other_text/text/text/5418874-some_other_txet.html
/text/other_text/text/text/some_other_txet-4157/text.html
我想要做的是从/
之后提取第一个数字,例如每行123
。
为了解决这个问题,我尝试了以下方法:
num = gsub("\\D"," ", mydata$pagePath) /*to delete all characters other than digits */
num1 = gsub("\\s+"," ",num) /*to let only one space between numbers*/
num2 = gsub("^\\s","",num1) /*to delete the first space in my string*/
my_number = gsub( " .*$", "", num2 ) /*to select the first number on my string*/
我认为我想要的是什么,但我遇到了一些麻烦,特别是对于示例中最后一行的行:/text/other_text/text/text/some_other_txet-4157/text.html
所以,我真正想要的是在/
之后提取第一个数字。
非常欢迎任何帮助。
答案 0 :(得分:5)
您可以将以下正则表达式与gsub
:
"^(?:.*?/(\\d+))?.*$"
并替换为"\\1"
。请参阅regex demo。
代码:
> s <- c("/text/other_text/123-some_other_txet-4571/text.html", "/text/other_text/another_txet/15-some_other_txet.html", "/text/other_text/25189-some_other_txet/45112-text.html", "/text/other_text/text/text/5418874-some_other_txet.html", "/text/other_text/text/text/some_other_txet-4157/text.html")
> gsub("^(?:.*?/(\\d+))?.*$", "\\1", s, perl=T)
[1] "123" "15" "25189" "5418874" ""
正则表达式将可选地(使用(?:.*?/(\\d+))?
子模式)匹配从开头到第一个/
(带有.*?/
)的一部分字符串,后跟一个或多个数字(捕获第1组中的数字,(\\d+)
},然后是字符串的其余部分,直到结尾(使用.*$
)。
请注意,perl=T
是必需的。
使用 stringr str_extract
,您的代码和模式可以缩短为:
> str_extract(s, "(?<=/)\\d+")
[1] "123" "15" "25189" "5418874" NA
>
str_extract
如果前面有/
,则会提取前1个或多个数字(/
本身不会作为匹配的一部分返回,因为它是 lookbehind 子模式,零宽度断言,不会将匹配的文本放入结果中。
答案 1 :(得分:2)
试试这个
\/(\d+).*
输出:
MATCH 1
1. [26-29] `123`
MATCH 2
1. [91-93] `15`
MATCH 3
1. [132-137] `25189`
MATCH 4
1. [197-204] `5418874`