stringr: регулярное выражение для сопоставления и извлечения строк (включая уникальные подстроки), содержащих одинаковую подстроку - PullRequest
0 голосов
/ 14 декабря 2018

Итак, у меня есть столбец в кадре данных, который содержит несколько имен, таких как:

colnames <- c("YouAreHappy","YouAreHappy1", "YouAreHappy2", "NiceSmiles", "NiceSmiles1", "NiceSmiles2")

Я пытаюсь использовать функцию stringr * str_extract, чтобы извлечь только определенную часть имена именно такие вещи, как "Happy", "Happy1", "Happy2", "Smiles", "Smiles1" и "Smiles2".

Я попытался использовать регулярное выражение с `str_extract 'следующим образом:

> str_extract(colnames, regex("Happy|Happy1|Happy2|Smiles|Smiles1|Smiles2"))
[1] "Happy"  "Happy"  "Happy"  "Smiles" "Smiles" "Smiles"

Но я хочу извлечь:

[1] "Happy"  "Happy1"  "Happy2"  "Smiles" "Smiles1" "Smiles2"

Я, очевидно, поступаю неправильно, но я не знаю, где и как.Я понимаю, что | подразумевает OR, но я не знаю достаточно о регулярных выражениях, чтобы обойти это препятствие.Я совершенно новичок в регулярных выражениях и тому подобном (только что обнаружил регулярные выражения 101 ), поэтому любые указатели приветствуются.

1 Ответ

0 голосов
/ 14 декабря 2018

При использовании шаблона Happy|Happy1|Happy2|Smiles|Smiles1|Smiles2 помните, что первая альтернатива, которая соответствует "победам" и механизму регулярных выражений ICU (используется в stringr ), не рассматривает следующие альтернативы.Обратите внимание, что несколько вариантов в вашем регулярном выражении могут совпадать в одном и том же месте, и более короткая идет перед более длинными.Вот почему результат не так, как ожидалось.См. Помните, что движок Regex стремится .

Это правда, что механизм TRE regex работает по-другому.regmatches(colnames, gregexpr("Happy|Happy1|Happy2|Smiles|Smiles1|Smiles2", colnames)) даст вам ожидаемые совпадения, потому что это текстовый движок регулярных выражений и самая длинная подходящая альтернатива «выигрывает».См. Текстовый двигатель возвращает самое длинное совпадение .

Однако вы можете просто использовать

"(Smiles|Happy)\\d*"

в обоих двигателях, чтобы получить одинаковыйвыход.Убедитесь, что альтернативы не совпадают в одном и том же месте строки, это лучший способ.(Smiles|Happy)\d* соответствует либо Smiles или Happy, а затем 0 или более цифр.

...