R: Извлечение данных из строки с использованием регулярного выражения POSIX - PullRequest
2 голосов
/ 16 апреля 2011

Как извлечь из этой строки только DATABASE_NAME, используя регулярные выражения в стиле POSIX?

st <- "MICROSOFT_SQL_SERVER.DATABASE\INSTANCE.DATABASE_NAME."

Прежде всего, это приводит к ошибке

Error: '\I' is an unrecognized escape in character string starting "MICROSOFT_SQL_SERVER.DATABASE\I"

Я думал что-то вроде

sub(".*\\.", st, "")

Ответы [ 3 ]

3 голосов
/ 16 апреля 2011

Первая проблема заключается в том, что вам нужно экранировать \ в вашей строке:

st <- "MICROSOFT_SQL_SERVER.DATABASE\\INSTANCE.DATABASE_NAME."

Что касается основной проблемы, она вернет нужный бит из строки, которую вы дали:

> sub("\\.$", "", sub("[A-Za-z0-9\\._]*\\\\[A-Za-z]*\\.", "", st))
[1] "DATABASE_NAME"

Но более простым решением было бы разделить на \\. и выбрать последний фрагмент:

> strsplit(st, "\\.")[[1]][3]
[1] "DATABASE_NAME"

или немного более автоматизированный

> sst <- strsplit(st, "\\.")[[1]]
> tail(sst, 1)
[1] "DATABASE_NAME"
2 голосов
/ 16 апреля 2011

Другие ответы предоставили несколько действительно хороших альтернативных способов решения проблемы с использованием strsplit или str_split.

Однако, если вы действительно хотите использовать регулярное выражение и gsub, это решение заменяет первые два вхождения (строка, за которой следует точка) пустой строкой.

Обратите внимание на использование модификатора ?, чтобы указать регулярному выражению не быть жадным, а также модификатора {2}, чтобы он повторил выражение в скобках два раза.

gsub("\\.", "", gsub("(.+?\\.){2}", "", st)) 
[1] "DATABASE_NAME"
1 голос
/ 16 апреля 2011

Альтернативный подход заключается в использовании str_split в пакете stringr.Идея состоит в том, чтобы разбить st на строки в каждом периоде, а затем выделить третью строку:

st <- "MICROSOFT_SQL_SERVER.DATABASE\\INSTANCE.DATABASE_NAME."

library(stringr)

str_split(st, "\\.")[[1]][3]

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