Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 仅从字符串中提取某个单词_Regex_Substring - Fatal编程技术网

Regex 仅从字符串中提取某个单词

Regex 仅从字符串中提取某个单词,regex,substring,Regex,Substring,我有一份美国总统的名单,上面有关于各种主题的演讲(尽管有些没有标签),在文件名栏中,我有如下格式的内容 1981\u里根,1982\u经济\u里根。。。1994年克林顿,1994年克林顿刑事司法 (每一行)我想摘录哪位总统发言。我打算使用一个函数,如sub_str,但不确定如何提取名称-显然,名称的不同长度是一个考虑因素,但也不想提取不需要的信息,如年份或其他单词。这里有一个使用strsplit的简单方法,假设总统的名字总是在字符串的末尾,并用“u”隔开: 将小于或等于的所有字符替换为零。这是贪

我有一份美国总统的名单,上面有关于各种主题的演讲(尽管有些没有标签),在文件名栏中,我有如下格式的内容

1981\u里根,1982\u经济\u里根。。。1994年克林顿,1994年克林顿刑事司法


(每一行)我想摘录哪位总统发言。我打算使用一个函数,如
sub_str
,但不确定如何提取名称-显然,名称的不同长度是一个考虑因素,但也不想提取不需要的信息,如年份或其他单词。

这里有一个使用strsplit的简单方法,假设总统的名字总是在字符串的末尾,并用“u”隔开:

将小于或等于
的所有字符替换为零。这是贪婪的,因此它将一直替换到最后一个

您还可以:

vec <- c("1981_Reagan",
         "1982_economy_Reagan",
         "1994_Clinton",
         "1994_criminal_justice_Clinton")

sub(".*_(\\w+)","\\1",vec,perl=T)

#[1] "Reagan"  "Reagan"  "Clinton" "Clinton"

vec在示例输入中,至少有一个规则是总统的名字(,并且只有他们的名字)是大写的

你可以利用这一点

library(stringr)
str_extract(original_string, "(?<=_)[A-Z][^_]+")
[1] "Reagan"  "Reagan"  "Clinton" "Clinton"
库(stringr)

str_extract(原始字符串),(?来自R-标记信息:
“R是一个免费的[…]计算。为您的问题提供最小的、可复制的、具有代表性的示例。使用dput()对于数据,请指定具有库调用的所有非基本包。不要为数据或代码嵌入图片,请使用缩进代码块。对于统计信息问题,请使用http://stats.stackexchange.com.“
谢谢,这正是我希望看到的输出。Thanks@The统计学家魔术师很高兴能帮上忙,我用
gsub
添加了另一种方法,你为什么不直接做
sub(“.+\u”,”,vec)
?@onyanbu谢谢,我在你发表评论之前添加了它。
sub(“.\u”,”,vec)
将完成这项工作。无需捕获和使用反向引用,这将减慢程序的运行速度that@Onyambu上次我盲目地信任你;-)。你在比较中更改了两个变量。perl和BackReference。这是不可能发生的。你使用了
sub(“.\u(\\ w+”,“\\1”,vec)
如果您想知道复杂性,那么您可以将其与
sub(“.*”,vec)进行比较。
实际上,即使
gsub(“.*”,vec)
也比您的要快,因为您使用了反向引用
原始_string@AndreElrico是的,这是现实主义-示例输入非常有限(而且描述很少)。我在我的答案中添加了一个粗体的警告。只需使用regex
(?@Onyambu,字符串以名称结尾似乎是合理的,但有两个答案已经建立在这一点上。因此,我的解决方案是一种替代方案,以防出现类似“2009年中东奥巴马开罗”的情况
vec <- c("1981_Reagan",
         "1982_economy_Reagan",
         "1994_Clinton",
         "1994_criminal_justice_Clinton")

sub(".*_(\\w+)","\\1",vec,perl=T)

#[1] "Reagan"  "Reagan"  "Clinton" "Clinton"
vec <- c("1981_Reagan",
         "1982_economy_Reagan",
         "1994_Clinton",
         "1994_criminal_justice_Clinton")

vec <- rep(vec,99999)

f1 <- function(vec) {sub(".*_", "", vec)}

f2 <- function(vec) {sub(".*_(\\w+)","\\1",vec,perl=T)}

f3 <- function(vec) {gsub(".+_", "", vec)}

microbenchmark::microbenchmark( f1(vec), f2(vec), f3(vec),times=100)

#Unit: milliseconds
#    expr      min       lq     mean   median       uq      max neval cld
# f1(vec) 212.8052 213.9725 215.5334 215.1973 216.5564 222.4681   100  b 
# f2(vec) 133.7839 134.6375 136.0296 135.0752 136.3612 142.8160   100 a  
# f3(vec) 290.8456 293.4051 295.5549 294.5525 295.5341 338.8277   100   c
library(stringr)
str_extract(original_string, "(?<=_)[A-Z][^_]+")
[1] "Reagan"  "Reagan"  "Clinton" "Clinton"
original_string <- c(
  "1981_Reagan", 
  "1982_economy_Reagan", 
  "1994_Clinton", 
  "1994_criminal_justice_Clinton"
)