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*\\()
    -正向前瞻,紧靠当前位置右侧,需要存在:
    • \\s*
      -0+空格字符
    • \\(
      -文字

删除final
(…)
不是更容易吗?使用
sub(\\s*\\([^()]*\\)\\s*$”,“”,baseball1$Managers)
@WiktorStribiżew这更容易,但是我需要使用stru extractżall,而且,一些名称有两个名称,如“t.Collins(51-82)J.Maddon(12-31)”,使用该代码将输出:“t.Collins(51-82)和J.Maddon“Try
name\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*\\()")