我有一堆具有这种模式的字符串:
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/