在特定模式之后提取特定单词,同时排除指定模式。在 R

Extracting certain word(s) after specific pattern, while excluding specified patterns. in R

使用R,我想提取建筑物、广场或豪宅的名称。名称前面是否指定了建筑物,豪宅,广场。 这是一个例子

addresses<-c("big fake plaza, 12 this street,district, city", 
"Green mansion, district, city", 
 "Block 7 of orange building  district, city",
"98 main street block a blue plaza, city",
 "blue red mansion, 46 pearl street, city")            

我想得到的是

"big fake" "Green" "orange" "blue" "blue red"

我目前使用的代码是

str_extract(addresses, "[[a-z]]*\s*[[a-z]+]*\s*(?=(building|mansion|plaza))")

名字有时是两个词,有时是一个词。然而,由于格式不同,有时 'a' 或 'of' 也会被提取。如何继续提取建筑物名称的两个word格式但排除'a'或'of'

提前致谢

我真的想不出一个可以在一个正则表达式中处理所有问题的解决方案。

这里有两个步骤。

  1. 提取(building|mansion|plaza)
  2. 之前的一两个词
  3. 从提取的单词中删除 (on|of|a)
vals <- stringr::str_match(addresses, "(\w+?\s?\w+)\s(building|mansion|plaza)")[, 2]
trimws(gsub('\b(on|of|a)\b', '', vals))

#[1] "big fake" "Green"    "orange"   "blue"     "blue red"

一个选项是有选择地匹配第一个词,排除一些使用否定前瞻不被接受的词。

\b(?:(?!of|a)[a-zA-Z]+\s+)?[a-zA-Z]+\b(?=\s+(?:building|mansion|plaza)\b)

模式匹配:

  • \b一个单词边界
  • (?:非捕获组
    • (?!of|a)负前瞻,断言不是ofa直接向右
    • [a-zA-Z]+\s+ 如果断言为真,则匹配 1+ 次 a-zA-Z 后跟 1+ 空白字符
  • )? 关闭组并使其可选
  • [a-zA-Z]+\b 匹配 1+ 次字符 a-zA-Z 和单词边界
  • (?=正向前瞻,断言右边的是
    • \s+ 匹配 1+ 个空白字符
    • (?:building|mansion|plaza)\b 匹配其中一个选项
  • ) 关闭前瞻

Regex demo

addresses<-c("big fake plaza, 12 this street,district, city", 
"Green mansion, district, city", 
 "Block 7 of orange building  district, city",
"98 main street block a blue plaza, city",
 "blue red mansion, 46 pearl street, city")
 
str_extract(addresses, "\b(?:(?!of|a)[a-zA-Z]+\s+)?[a-zA-Z]+\b(?=\s+(?:building|mansion|plaza)\b)")

输出

[1] "big fake" "Green"    "orange"   "blue"     "blue red"

注意 [[a-z]]* 应该用单括号 [a-z]* 如果你想重复字符 class 中的 a-z 范围,如果要在字符 class.

中重复范围 1+ 次,[[a-z]+]* 应该是 [a-z]+