我有一个文本文件,它是pdf_text()
的pdftools
函数的输出。我想在标签Name :
的eache出现后提取名字。麻烦的是名称本身没有格式化,可能包含两个或多个单词,首字母和/或句点,用空格分隔。具有所需模式的示例行如下所示:
"Name : O P Bansal Name : Ganga Jawar Name : Ramachandran G."
我想要一份表格清单:
"O P Bansal" "Ganga Jawar" "Ramachandran G."
名称已经更改,但它们代表了我正在使用的内容。名称开始前至少有5个空格,后面至少有10个空格或换行符。名称本身的各个组件由单个空格或句点后跟单个空格分隔(如果是初始)
我可以将其表达为R中的正则表达式吗?某种形式'Name :\\s+(\\w+\\s)+'
您可以使用单个正则表达式提取它们:
\bName\s*:\s*\K.*?(?=$|\s*Name\s*:)
细节
\bName
- 一个完整的单词Name
(前面有一个单词边界\b
)\s*:\s*
- 用0+空格字符括起来的:
\K
- 匹配重置运算符.*?
- 除了换行符之外的任何0 +字符,尽可能少,必须遵循...(?=$|\s*Name\s*:)
- 字符串结尾($
)或0+空格,Name
,零个或多个whitespaces和:
。x <- "Name : O P Bansal Name : Ganga Jawar Name : Ramachandran G."
regmatches(x, gregexpr("\\bName\\s*:\\s*\\K.*?(?=$|\\s*Name\\s*:)", x, perl=TRUE))
# => [[1]]
# [1] "O P Bansal" "Ganga Jawar" "Ramachandran G."
试试这段代码:
你的名字
list<- "Name : O P Bansal Name : Ganga Jawar Name : Ramachandran G."
提取名称删除初始和结束空格
list_names<-trimws(unlist(strsplit(list,"Name :")))
list_names<-list_names[list_names!=""]
你的输出
list_names
[1] "O P Bansal" "Ganga Jawar" "Ramachandran G."
我们可以使用strsplit
trimws(strsplit(str1, "Name\\s*:\\s*")[[1]])[-1]
#[1] "O P Bansal" "Ganga Jawar" "Ramachandran G."
或者与gsub
trimws(scan(text=gsub("\\s{2,}", ", ", gsub("Name\\s*:\\s*", "", str1)), what = "", sep=","))
#[1] "O P Bansal" "Ganga Jawar" "Ramachandran G."
或者我们可以使用tidyverse
library(tidyverse)
str1 %>%
tibble(col = .) %>%
separate_rows(col, sep = "Name\\s*\\:\\s*") %>%
filter(nzchar(col)) %>%
mutate(col = trimws(col)) %>%
pull(col)
#[1] "O P Bansal" "Ganga Jawar" "Ramachandran G."
str1 <- "Name : O P Bansal Name : Ganga Jawar Name : Ramachandran G."