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

R 提取字符串,但有一些例外,r,regex,R,Regex,我有一堆这样的字符串: w <- c("milan 01", "New York", "las vegas 123", "London abc") 期望的: #[1] "milan" "New York" "las vegas" "London" 你可以用 > library(stringr) > w <- c("Milan 01", "New York", "Las vegas 123", "London abc") > str_extract(w,

我有一堆这样的字符串:

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

#[1] "milan"   "New York"   "las vegas"  "London"
你可以用

> 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"  
详细信息

  • ^
    -字符串的开头
  • \\p{L}+
    -1+个字母(如果您计划只支持ASCII,可以使用
    [a-zA-Z]+
  • (?:\\s+(?!abc\\b)\\p{L}+)
    -可选的
    • \\s+
      -1+空格
    • (?!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)
使
匹配任何字符,包括换行符,整个特定部分用捕获括号括起来,匹配被替换为第1组值。

请记住,我可能不知道哪个城市有
“abc”
,我只知道有一个。然后你需要一个负前瞻
^[a-zA-Z]+(?:+(?!abc\\b)[a-zA-Z]+)
谢谢,这很有效。如果我不知道“abc”模式会怎样?我必须找到所有错误的模式并添加它们,我想,或者有其他方法吗?@RLave您不必全部添加,但您应该知道要排除的模式。否则,无法使用regex。
> str_extract(w, "^(?!abc\\b)\\p{L}+(?:\\s+(?!abc\\b)\\p{L}+)?")   
                   ^^^^^^^^^^
> 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"