我的字符串看起来像a
,如下所示。我需要提取 first //
和第一个后续/
之间的部分字符串。我将sub
与perl = F
一起使用,但它比perl = T
慢大约4倍。所以我尝试perl = T
并发现搜索从字符串的结尾开始??
a = "https://moo.com/meh/woof//A.ds.serving/hgtht//ghhg/tjtke"
print(gsub(".*//(.*?)/.*","\\1",a))
"moo.com"
print(gsub(".*//(.*?)/.*","\\1",a,perl=T))
"ghhg"
我需要 moo.com
。我很惊讶地看到这个 - 它是在某处记录的吗?如何用perl
重写它 - 我有20M行可以使用,速度很重要。谢谢!
编辑:没有给出每个字符串都以http
答案 0 :(得分:1)
您也可以尝试.*?//(.*?)/.*
使第一个.*
懒惰,以便//
与第一个//
实例匹配:
gsub(".*?//(.*?)/.*","\\1",a,perl=T)
# [1] "moo.com"
?gsub
说:
据报道标准正则表达式代码非常慢 当应用于极长的字符串(数万个 字符或更多):perl = TRUE时使用的代码似乎要快得多 这种用法更可靠。
gsub的标准版本无法正确重复替换 单词边界(例如pattern =" \ b")。使用perl = TRUE 匹配。