繁体   English   中英

提取一些异常的字符串

[英]extract strings with some exceptions

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

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

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

但是我也必须对"London"类的案件例外。

(为简化问题,我可以将字符串"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"

您可以使用

> 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)使. 匹配包括换行符在内的所有字符,整个特定部分包装在捕获括号中,然后将匹配项替换为组1值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM