Регулярное выражение R извлекает похожие слова, но у одного есть дефис

У меня есть следующий фрейм данных:

species    size_description
1          "some text Small some text"
2          "some text small-med some text"
3          "some text Med. some text"
4          "some text medium some text"
5          "some text med-large some text"
6          "some text large some text"

Я хотел бы написать регулярное выражение, которое фиксирует размер в поле описания размера, поэтому оно будет выглядеть так:

species    size_description                    newSize                            
1          "some text Small some text"         "Small"
2          "some text small-med some text"     "small-med"
3          "some text Med. some text"          "Med."
4          "some text medium some text"        "medium"
5          "some text med-large some text"     "med-large"
6          "some text large some text"         "large"

Я пытался сделать это следующим образом:

size_regex = paste(
                "[Ss]{1}mall",
                "[Mm]{1}ed\\.*i*u*m*",
                "[Mm]{1}ed\\.*i*u*m*-*\\s*[Ll]{1}arge",       #doesnt work
                "[Ss]{1}mall-*\\s*[Mm]{1}ed\\.*i*u*m*",       #doesnt work
                "[Ll]{1}arge",
                sep = "|"
                )

df$newSize = str_extract(df$size_description, age_regex)

НО, он не может различать те, у которых есть дефис. Например, для вида 2 он записывается как «маленький», а не как «маленький-средний».

Как я могу написать регулярное выражение, которое будет делать это в R? Я предпочитаю пакет stringr, но подойдет любой.

Обратите внимание, что причина, по которой я оставляю вариант для полных слов в моем регулярном выражении, заключается в том, что в некоторых описаниях используется полное слово. Например, некоторые могут быть «маленькими-средними», а другие просто «маленькими-средними».


person Oliver Oliver    schedule 05.06.2016    source источник
comment
всегда ли размер стоит на третьем слове?   -  person rock321987    schedule 05.06.2016
comment
нет, это может быть где угодно в строке   -  person Oliver Oliver    schedule 05.06.2016
comment
какие возможные size элементы вы рассматриваете?   -  person rock321987    schedule 05.06.2016
comment
Я перечислил их в поле newSize, это все возможные размеры.   -  person Oliver Oliver    schedule 05.06.2016
comment
Хорошо ли это ?   -  person rock321987    schedule 05.06.2016


Ответы (1)


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

(\S*(?:[Ss]mall|[Ll]arge|[Mm]edium|Med[.])\S*)

Демонстрация регулярных выражений

person rock321987    schedule 05.06.2016
comment
Да, это выглядит хорошо. Насколько мне известно, можете ли вы объяснить, как это регулярное выражение подбирает дефис? Скажем, например, если бы мне нужно было отдельное регулярное выражение только для small-med, как я мог бы это сделать? - person Oliver Oliver; 05.06.2016
comment
@OliverOliver на самом деле, я пытаюсь найти слово Small, Large, Medium или Med. и выбрать любое слово, которое находится непосредственно перед (и после) этими упомянутыми словами и не является пробелом. - person rock321987; 05.06.2016
comment
@OliverOliver для small-med, вы можете напрямую использовать как есть - person rock321987; 05.06.2016
comment
О, хорошо, я вижу, что ты делаешь. Спасибо. - person Oliver Oliver; 05.06.2016
comment
@OliverOliver рад помочь - person rock321987; 05.06.2016