У меня есть набор строк вида:
Team XYZJohn SMITH / Jane SMITH
TEAM RacersJim SMITH / Jane SMITH
John McMahon RacingBob SMITH / Jane SMITH
и хотите разделить объединенные имена, чтобы получить строки вроде:
Team XYZ :: John SMITH / Jane SMITH
TEAM Racers :: Jim SMITH / Jane SMITH
John McMahon Racing :: Bob SMITH / Jane SMITH
Я в R, использую Perl, но это регулярное выражение, которое я ищу.
Через https://stackoverflow.com/a/43706490/454773, это работает для TEAM RacersJohn SMITH / Jane SMITH
:
paste(strsplit('TEAM RacersJohn SMITH / Jane SMITH', "(?<=[a-z])(?=[A-Z])", perl = TRUE)[[1]], collapse=' :: ')
но, очевидно, дает нежелательное разделение в McMahon
и пропускает разделение в Team XYZJohn
.
Для таких вещей, как McMahon
, я думал, что эвристика не разбивается на [A-Z][a-z]{1,2}[A-Z]
, которая также справляется, например, с MacDonald
.
Тест на:
#Team XYZ :: John SMITH / Jane SMITH
#TEAM Racers :: John SMITH / Jane SMITH
#John McMahon Racing :: John SMITH / Jane SMITH
regex="(?<![A-Z][a-z])(?=[A-Z][a-z])"
print(paste(strsplit('Team XYZJohn SMITH / Jane SMITH', regex, perl = TRUE)[[1]], collapse=' :: '))
print(paste(strsplit('TEAM RacerJim SMITH / Jane SMITH', regex, perl = TRUE)[[1]], collapse=' :: '))
print(paste(strsplit('John McMahon RacingBob SMITH / Jane SMITH', regex, perl = TRUE)[[1]], collapse=' :: '))
Через @graemefowler в Твиттере мы имеем: s/^(.+[A-Z][a-zA-Z]+)([A-Z]\w+ [A-Z]+ \/.+)/$1 :: $2/;
print(gsub("^(.+[A-Z][a-zA-Z]+)([A-Z]\\w+ [A-Z]+ \\/.+)", "\\1 :: \\2", "TEAM RacersJohn SMITH / Jane SMITH", perl=TRUE))
print(gsub("^(.+[A-Z][a-zA-Z]+)([A-Z]\\w+ [A-Z]+ \\/.+)", "\\1 :: \\2", "Team XYZJohn SMITH / Jane SMITH", perl=TRUE))
print(gsub("^(.+[A-Z][a-zA-Z]+)([A-Z]\\w+ [A-Z]+ \\/.+)", "\\1 :: \\2", "John McMahon RacingJohn SMITH / Jane SMITH", perl=TRUE))
[1] "TEAM Racers :: John SMITH / Jane SMITH"
[1] "Team XYZ :: John SMITH / Jane SMITH"
[1] "John McMahon Racing :: John SMITH / Jane SMITH"