【问题标题】:Extracting certain word(s) after specific pattern, while excluding specified patterns. in R在特定模式之后提取某些单词,同时排除特定模式。在 R 中
【发布时间】:2021-06-21 20:28:00
【问题描述】:

使用 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'

提前致谢

【问题讨论】:

    标签: r regex string extract


    【解决方案1】:

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

    \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+ 次 char a-zA-Z 后跟 1+ 空白字符
    • )? 关闭群组并将其设为可选
    • [a-zA-Z]+\b 匹配 1+ 次 char 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]*,如果你想在字符类中重复范围az,如果你想[[a-z]+]*应该是[a-z]+在字符类中重复范围 1 次以上。

    【讨论】:

      【解决方案2】:

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

      这是一个两步过程。

      1. (building|mansion|plaza)之前提取一两个词
      2. 从提取的单词中删除(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"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-01
        • 1970-01-01
        • 2021-11-04
        • 2018-12-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多