r - 提取字符串,但有一些异常(exception)

标签 r regex

我有一堆具有这种模式的字符串:

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

我只想提取城市名称,即第一个字符串或前两个字符串,中间有一个空格。

但我也必须对像“London”这样的情况异常(exception)。

(为了简化问题,我可以将字符串 "abc" 作为异常(exception)传递给正则表达式)。

我已经这样做了:

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"

最佳答案

您可以使用

> 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}+ - 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) 使 . 匹配包括换行符在内的任何字符,整个特定部分包含在捕获括号中,并且匹配被替换为 Group 1 个值。

关于r - 提取字符串,但有一些异常(exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52776885/

相关文章:

r - 将一列与另一个包含多个条目的 df 中的另一列进行比较

r - 如何在R中与其他组相关的组中选择最常见的值?

Mysql 替换两个模式之间包含的文本

javascript - 将 JavaScript 中的单词匹配到空格

r - 从 R 中的 igraph 对象中提取带条件的边列表

r - ggplot2中的两列分组

c# - 在格式化字符串中提取一些值

Java正则表达式排除开头日期并期望结尾日期

javascript - 测试字符串中的多个单词

java - 在 Mac 上为 Java 1.7 编译 rJava