Как разделить строки, которые смешивают верхний и нижний регистр? - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть набор строк вида:

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"

1 Ответ

1 голос
/ 13 апреля 2019

Этот RegEx может помочь вам получить одну целевую группу пробел + SMITH + пробел :

 \s[A-Z]+\s\/

Выход

enter image description here

Этот RegEx может помочь вам получить две целевые группы, и вы можете использовать строку замены, чтобы поместить пробел перед группой 1 и пробел + :: до второй группы:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...