R 正则表达式以查找包含空格和标点符号的精确匹配
我正在浏览一个包含文本值(名称)的数据集,其格式如下所示:R 正则表达式以查找包含空格和标点符号的精确匹配,r,regex,regex-negation,stringr,R,Regex,Regex Negation,Stringr,我正在浏览一个包含文本值(名称)的数据集,其格式如下所示: M.Joan (13-2) A.Alfred (20-13) F.O'Neil (12-231) D.Dan Fun (23-3) T.Collins (51-82) J.Maddon (12-31) 有些字符串中有两个名称,如 M.Joan (13-2) A.Alfred (20-13) 我只想从字符串中提取名称。 有些名称很容易提取,因为它们没有空格或任何东西。 然而,有些很难,因为他们有一个像上面最后一个一样的空
M.Joan (13-2)
A.Alfred (20-13)
F.O'Neil (12-231)
D.Dan Fun (23-3)
T.Collins (51-82) J.Maddon (12-31)
有些字符串中有两个名称,如
M.Joan (13-2) A.Alfred (20-13)
我只想从字符串中提取名称。
有些名称很容易提取,因为它们没有空格或任何东西。
然而,有些很难,因为他们有一个像上面最后一个一样的空间
name_pattern = "[A-Z][.][^ (]{1,}"
base <- str_extract_all(baseball1$Managers, name_pattern)
你可以用
x <- c("M.Joan (13-2) ", "A.Alfred (20-13)", "F.O'Neil (12-231)", "D.Dan Fun (23-3)", "T.Collins (51-82) J.Maddon (12-31)", "T.Hillman (12-34) and N.Yost (23-45)")
regmatches(x, gregexpr("\\p{Lu}.*?(?=\\s*\\()", x, perl=TRUE))
看
相配
-大写字母\p{Lu}
-除换行符以外的任何字符,在第一次出现之前尽可能少(但不包括在匹配中,因为*?
是非消耗性构造)(?=…)
-正向前瞻,紧靠当前位置右侧,需要存在:(?=\\s*\\()
-0+空格字符\\s*
-文字\\(
)(
(…)
不是更容易吗?使用sub(\\s*\\([^()]*\\)\\s*$”,“”,baseball1$Managers)
@WiktorStribiżew这更容易,但是我需要使用stru extractżall,而且,一些名称有两个名称,如“t.Collins(51-82)J.Maddon(12-31)”,使用该代码将输出:“t.Collins(51-82)和J.Maddon“Tryname\u pattern=“[A-Z][.][^\\s(]{1,}”
奇怪,使用您提供的str\u extract\u,一些输出“T.Hillman”和N.Yost“这并不奇怪。如果名称总是以大写字母开头,只需将\p{L}
替换为\p{Lu Lu
。太好了。如果您想尝试使用gregexpr
,并且名称中有Unicode字母,那么在模式开始处添加(*UCP)
会更安全:“(*UCP)\\p{Lu}.*(?=\\s*\()”
。在stringr方法中,您不需要这样做,因为ICU regex在某种程度上已经知道Unicode了。
x <- c("M.Joan (13-2) ", "A.Alfred (20-13)", "F.O'Neil (12-231)", "D.Dan Fun (23-3)", "T.Collins (51-82) J.Maddon (12-31)", "T.Hillman (12-34) and N.Yost (23-45)")
regmatches(x, gregexpr("\\p{Lu}.*?(?=\\s*\\()", x, perl=TRUE))
str_extract_all(baseball1$Managers, "\\p{Lu}.*?(?=\\s*\\()")