Удалить подстроку из строки между специальными символами в R - PullRequest
0 голосов
/ 16 июня 2020

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

str1 <- 'txt1/txt2/123|abc_def_123|1991-02-11'

что-то вроде этого:

txt1|abc_def_123|1991-02-11

, поэтому все от / (включительно) до первого появления | должно быть удалено. Пока что я написал это:

sub("\\/.*\\|", "|", str1 )

, но он удаляет все до последнего появления |

"txt1|1991-02-11"

Как я могу указать, что подстрока должна быть удалена в он первое появление |?

Ответы [ 4 ]

3 голосов
/ 16 июня 2020

Вы можете использовать /[^|]*, который принимает первый / и все после него, если это не |.

sub("/[^|]*", "", str1)
#[1] "txt1|abc_def_123|1991-02-11"
2 голосов
/ 16 июня 2020

Вы можете использовать отрицательный символьный класс с положительным просмотром вперед.

/[^|]*(?=\|)

Чтобы не пересекать символы новой строки, вы можете расширить отрицательный символьный класс:

/[^|\r\n]*(?=\|)

regex demo

str1 <- 'txt1/txt2/123|abc_def_123|1991-02-11'
sub("/[^|]*(?=\\|)", "", str1, perl=TRUE)

Выход

[1] "txt1|abc_def_123|1991-02-11"
2 голосов
/ 16 июня 2020

Другой подход заключается в использовании обратной ссылки:

sub("(^.*)/.*/.*?(\\|.*$)", "\\1\\2", str1)
[1] "txt1|abc_def_123|1991-02-11"

Здесь двойная обратная ссылка \\1\\2 «отзывает» строки в двух группах захвата (...), в то время как части, не включенные в группы захвата, получают удалено.

2 голосов
/ 16 июня 2020

После вашей попытки вы можете сделать свое регулярное выражение ленивым

sub("/.*?\\|", "|", str1 )
#[1] "txt1|abc_def_123|1991-02-11"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...