[英]How to use stringr and regex to convert strings(change, keep, extract) with some exceptions?
[英]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.