用于查找由R中的空格分隔的两个或多个单词名称的正则表达式

问题描述 投票:2回答:3

我有一个文本文件,它是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)+'

r regex parsing
3个回答
4
投票

您可以使用单个正则表达式提取它们:

\bName\s*:\s*\K.*?(?=$|\s*Name\s*:)

regex demo

细节

  • \bName - 一个完整的单词Name(前面有一个单词边界\b
  • \s*:\s* - 用0+空格字符括起来的:
  • \K - 匹配重置运算符
  • .*? - 除了换行符之外的任何0 +字符,尽可能少,必须遵循...
  • (?=$|\s*Name\s*:) - 字符串结尾($)或0+空格,Name,零个或多个whitespaces和:

R demo online

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."

1
投票

试试这段代码:

你的名字

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."

0
投票

我们可以使用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."

data

str1 <- "Name :       O P Bansal                    Name :       Ganga Jawar              Name :     Ramachandran G."
© www.soinside.com 2019 - 2024. All rights reserved.