[英]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”。 如何继续提取建筑物名称的两个单词格式但排除“a”或“of”
提前致谢
我真的想不出一个可以在一个正则表达式中处理所有这些的解决方案。
这是一个两步过程。
(building|mansion|plaza)
之前的一两个词(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)
负前瞻,断言 not of
或a
直接向右[a-zA-Z]+\s+
如果断言为真,则匹配 1+ 次字符 a-zA-Z 后跟 1+ 空白字符)?
关闭组并使其可选[a-zA-Z]+\b
匹配 1+ 次字符 a-zA-Z 和单词边界(?=
正向前瞻,断言右边是
\s+
匹配 1+ 个空格字符(?:building|mansion|plaza)\b
匹配其中一个选项)
关闭前瞻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)")
Output
[1] "big fake" "Green" "orange" "blue" "blue red"
请注意, [[az]]*
应该带有单括号[az]*
,如果您可以选择在字符 class 中重复范围 az,如果您想重复, [[az]+]*
应该是[az]+
字符 class 中的范围 1+ 倍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.