Удалить строку после первого числа с помощью r regex - PullRequest
4 голосов
/ 15 июня 2019

Как удалить все, что содержится после первого числа строки?

x <- c("Hubert 208 apt 1", "Mass Av 300, block 3")

После этого вопроса мне удалось удалить все до первого числа, включая первое число:

gsub( "^\\D*\\d+", "", x )
[1] " apt 1"    ", block 3"

Но желаемый результат выглядит так:

[1] "Hubert 208"     "Mass Av 300"
> 

Ответы [ 4 ]

4 голосов
/ 15 июня 2019

В текущем коде OP незначительное изменение может заставить его работать, т.е. захватить соответствующий шаблон как группу ((...)) и заменить на обратную ссылку (\\1)

sub("^(\\D*\\d+).*", "\\1", x)
#[1] "Hubert 208"  "Mass Av 300"

Здесь,шаблон из OP подразумевает ("^\\D*\\d+") - ноль или более символов, которые не являются цифрой (\\D*) от начала (^) строки, за которыми следуют одна или несколько цифр (\\d+), и этозахватывается как группа с паранами ((...)).

Кроме того, вместо gsub (глобальная замена) нам нужен только sub, поскольку нам нужно сопоставить только один экземпляр (с начала)

2 голосов
/ 15 июня 2019

Другой вариант вместо замены - взять выражение и использовать вместо него совпадение.

Ваш шаблон будет соответствовать до тех пор, пока первые цифры не будут совпадать с начала строки ^ 0+ раз, а не цифра \D*, а затем 1+ раз цифра \d+:

^\\D*\\d+

Regex demo

Если вы используете sub с perl = TRUE, вы можете использовать \K, чтобы забыть то, что было найдено.

Тогда вы можетеиспользуйте:

^\\D*\\d+\\K.*

Regex demo

При замене используйте пустую строку.

sub("^\\D*\\d+\\K.*", "", x, perl=TRUE)
1 голос
/ 15 июня 2019

Вы также можете использовать свой текущий шаблон регулярных выражений с stringr::str_extract:

x <- c("Hubert 208 apt 1", "Mass Av 300, block 3")
stringr::str_extract(x, "^\\D*\\d+")

[1] "Hubert 208"  "Mass Av 300"
1 голос
/ 15 июня 2019

Это выражение может быть немного безопаснее,

^\s*(.+?)([0-9]+)

Демо

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