совпадение после n-го вхождения в R stringr - PullRequest
0 голосов
/ 29 марта 2019

Как я могу сопоставить вещи между n-м и n + 1-м появлением канала?

В строке abc|def|ghi|jkl Я бы хотел соответствовать ghi.

Моя лучшая попытка -

str_match_all('abc|def|ghi|jkl', '((?<=\\|)[^|]*)')[2,1]

но это несколько неэффективно, потому что оно соответствует больше, чем мне нужно, а затем сокращает его в R до 2-го матча. Мне было интересно, есть ли более регулярный способ регулярного выражения, чтобы взять только n-й матч.

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Вы можете использовать

str_extract(x, "(?<=\\|)[^|]+(?=\\|[^|]+$)")
regmatches(x, regexpr("(?<=\\|)[^|]+(?=\\|[^|]+$)", x, perl=TRUE))
sub(".*\\|([^|]+)\\|[^|]+$", "\\1", x)

См. Демо regex (str_match / regmatches) и другое демо (sub).

Подробности

  • (?<=\\|) - обеспечивает наличие символа | непосредственно слева от текущего местоположения
  • [^|]+ - один или несколько символов, отличных от |
  • (?=\\|[^|]+$) - непосредственно справа от текущего местоположения, должен быть символ |, затем любые 0+ символов, кроме | изатем конец строки.

R:

library(stringr)
x <- "abc|def|ghi|jkl"
str_extract(x, "(?<=\\|)[^|]+(?=\\|[^|]+$)")
## => [1] "ghi"
regmatches(x, regexpr("(?<=\\|)[^|]+(?=\\|[^|]+$)", x, perl=TRUE))
## => [1] "ghi"
sub(".*\\|([^|]+)\\|[^|]+$", "\\1", x)
## => [1] "ghi"
0 голосов
/ 29 марта 2019

Вы ищете что-то подобное?Должен захватывать все между трубами.

r"(?<=\|)[^\|]*(?=\|)"
...