R正则表达式问题

时间:2016-03-11 09:41:26

标签: regex r

我有一个包含页面路径的数据框列:

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

所以,我真正想要的是在/之后提取第一个数字。

非常欢迎任何帮助。

2 个答案:

答案 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+).*

Demo

输出:

MATCH 1
1.  [26-29] `123`
MATCH 2
1.  [91-93] `15`
MATCH 3
1.  [132-137]   `25189`
MATCH 4
1.  [197-204]   `5418874`