2015-04-09 3 views
2

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

Вот код, я использую, чтобы создать новый столбец с разобранного текста (data.table синтаксис R):

regexp <- "(?:.*)([0-9]{2,3})(\\s?[Gg]?[Aa]?[Ll]?[Ll]?[Oo]?[Nn]?)(?:.*)" 
data <- data[, Volume := gsub(regexp, "\\1\\2", Title)] 

Данные выглядит следующим образом:

Nice 55 g fish tank with stand 
45 Gallon Aquarium fish tank and Stand 
Amazing Hexagonal Fish Tank. 
92gallon fish tank 
Fish Tank & Stand $30 obo 
2007 PROLINE 29' GRAND SPORT CENTER CONSOLE 
110 gallon tall fish tank 
20 and 10 Gallon Aquarium/Fish Tanks 

Результаты выглядят так:

55 g       <- fine 
45 Gallon      <- fine 
Amazing Hexagonal Fish Tank. <- not good. how to replace with NA? 
92gallon      <- fine 
30 o       <- wrongly identified 
29        <- wrongly identified 
10 gallon      <- I thought [0-9]{2,3} would grab 2 or 3 digits? 
10 gallon      <- only 1 of 2 tank sizes identified 

Цель состоит в том, чтобы вытащить размер объема танка из листинга как st насколько возможно. Итак, несколько вопросов:

  1. Является ли это лучшей функцией R для выполнения этой задачи? Сначала я старался оставаться в базовых функциях, прежде чем устанавливать пакет.

  2. Если в тексте не существует 2-значного числа, регулярное выражение, похоже, тянет весь текст. Я бы хотел «Удивительный гексагональный рыбный танк». быть НС.

  3. Есть еще пара вещей, если их легко исправить, но главными вопросами являются те, что указаны выше.

Я очень ценю помощь! Мне бы хотелось попрактиковаться в регулярных выражениях в R, но, видимо, для меня это медленный, немой процесс.

+2

* вне темы: * при назначении по ссылке (с помощью ': ='), вы не имеете для возврата результата. То есть 'data <-' избыточно. Проверьте виньет [Reference Semantics здесь] (https://github.com/Rdatatable/data.table/wiki/Getting-started). – Arun

+0

Да, я еще не думал о неверно идентифицированных ... но NA предпочтительнее! – AlexP

+0

Почему вы делаете каждое письмо необязательным? – hwnd

ответ

1

Я не уверен, что точные результаты вы ожидаете, но вот моя попытка:

x <- c('Nice 55 g fish tank with stand', 
     '45 Gallon Aquarium fish tank and Stand', 
     'Amazing Hexagonal Fish Tank.', 
     '92gallon fish tank', 'Fish Tank & Stand $30 obo', 
     "2007 PROLINE 29' GRAND SPORT CENTER CONSOLE", 
     '110 gallon tall fish tank', 
     '20 and 10 Gallon Aquarium/Fish Tanks') 

r <- regmatches(x, gregexpr('\\d{2,3}[^\n]*(?i:g\\b|gallon)', x, perl=TRUE)) 
unlist({r[sapply(r, length)==0] <- NA; r}) 

# [1] "55 g"    "45 Gallon"  NA     "92gallon"   
# [5] NA     NA     "110 gallon"  "20 and 10 Gallon" 
Смежные вопросы