Пронумерованные обратные ссылки для групп с подгруппами - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть слово «fan (s)», которое я хочу заменить словом «fanatic (s)», когда перед ним стоит комбо глагола «местоимение», показанное ниже.

gsub(
    "(((s?he( i|')s)|((you|they|we)( a|')re)|(I( a|')m)).{1,20})(\\b[Ff]an)(s?\\b)", 
    '\\1\\2atic\\3', 
    'He\'s the bigest fan I know.', 
    perl = TRUE, ignore.case = TRUE
)

## [1] "He's the bigest He'saticHe's I know."

Я знаю, что нумерованные обратные ссылкиссылаясь на внутреннюю скобку первой группы.Есть ли способ, чтобы они ссылались только на круглые скобки, где три группы: (stuff before fan)(fan)(s\\b) в псевдокоде.

Я знаю, что мое регулярное выражение может заменить все группы, если я знаю, что оно допустимо.Это просто часть обратной ссылки.

gsub(
    "(((s?he( i|')s)|((you|they|we)( a|')re)|(I( a|')m)).{1,20})(\\b[Ff]an)(s?\\b)", 
    '', 
    'He\'s the bigest fan I know.', 
    perl = TRUE, ignore.case = TRUE
)

## [1] " I know."

Желаемый результат:

## [1] "He's the bigest fanatic I know."

Примеры совпадений

inputs <- c(
    "He's the bigest fan I know.",
    "I am a huge fan of his.",
    "I know she has lots of fans in his club",
    "I was cold and turned on the fan",
    "An air conditioner is better than 2 fans at cooling."
)


outputs <- c(
    "He's the bigest fanatic I know.",
    "I am a huge fanatic of his.",
    "I know she has lots of fanatics in his club",
    "I was cold and turned on the fan",
    "An air conditioner is better than 2 fans at cooling."
)

1 Ответ

0 голосов
/ 25 сентября 2018

Я понимаю, у вас проблемы с чрезмерным количеством групп захвата.Превратите тех, кого вы не интересуете, в не захватывающих или удалите те, которые просто избыточны:

((?:s?he(?: i|')s|(?:you|they|we)(?: a|')re|I(?: a|')m).{1,20})\b(Fan)(s?)\b

См. Демонстрационную версию regex

Обратите внимание, что [Ff] можно превратить в F или f, поскольку вы используете аргумент ignore.case=TRUE.

R demo :

gsub(
    "((?:s?he(?: i|')s|(?:you|they|we)(?: a|')re|I(?: a|')m).{1,20})\\b(fan)(s?)\\b", 
    '\\1\\2atic\\3', 
    inputs, 
    perl = TRUE, ignore.case = TRUE
)

Вывод:

[1] "He's the bigest fanatic I know."                     
[2] "I am a huge fanatic of his."                         
[3] "I know she has lots of fans in his club"             
[4] "I was cold and turned on the fan"                    
[5] "An air conditioner is better than 2 fans at cooling."
...