代码之家  ›  专栏  ›  技术社区  ›  RLave

提取字符串,但有一些例外

  •  2
  • RLave  · 技术社区  · 7 年前

    我有一堆这样图案的弦:

    w <- c("milan 01", "New York", "las vegas 123", "London abc")
    

    但我也得破例处理像这样的案子 "London" .

    (为了简化问题,我可以将字符串传递给regex "abc"

    我已经做到了:

    library(stringr)
    
    str_extract(w, "^\\S*\\s+(\\S+)")
    #[1] "milan 01"   "New York"   "las vegas"  "London abc"
    
    str_extract(w, "^\\S*\\s+(\\S+)(\\D)") # can't understand why this won't work
    #[1] NA           "New York"   "las vegas " "London abc"
    

    #[1] "milan"   "New York"   "las vegas"  "London"
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Wiktor Stribiżew    7 年前

    你可以用

    > library(stringr)
    > w <- c("Milan 01", "New York", "Las vegas 123", "London abc")
    > str_extract(w, "^\\p{L}+(?:\\s+(?!abc\\b)\\p{L}+)?")
    # => [1] "milan"     "New York"  "las vegas" "London"  
    

    如果第一个词不能 abc 或者,在开头添加前瞻:

    > str_extract(w, "^(?!abc\\b)\\p{L}+(?:\\s+(?!abc\\b)\\p{L}+)?")   
                       ^^^^^^^^^^
    

    • ^ -字符串开头
    • \\p{L}+ [a-zA-Z]+ (取而代之)
    • (?:\\s+(?!abc\\b)\\p{L}+)? -一个可选的序列
      • \\s+
      • (?!abc\\b) -没有 abc公司 作为一个整体,单词可以直接出现在当前位置的右边
      • \\p{L}+ -1+个字母

    一个基本的R sub 等价物:

    > sub("(?s)^(\\p{L}+(?:\\s+(?!abc\\b)\\p{L}+)?).*", "\\1", w, perl=TRUE)
    > ## OR > sub("(?s)^(?!abc\\b)(\\p{L}+(?:\\s+(?!abc\\b)\\p{L}+)?).*", "\\1", w, perl=TRUE)
    [1] "milan"     "New York"  "las vegas" "London"
    

    在这里, (?s) 制造 .