Как посчитать годы в тексте на R? - PullRequest
1 голос
/ 29 мая 2020

Я хочу подсчитать количество лет между открывающей и закрывающей скобками в следующем тексте под названием txt.

library(stringr)
txt <- "Text Mining exercise (2020) Mining, p. 628508; Computer Science text analysis (1998) Computer Science, p.345-355; Introduction to data mining (2015) J. Data Science, pp. 31-33"

lengths(strsplit(txt,"\\(\\d{4}\\)")) дает мне 4, что неверно. Любая помощь, пожалуйста?

Ответы [ 3 ]

2 голосов
/ 29 мая 2020

Если вы предпочитаете Base-R,

regmatches(txt, gregexpr("[^0-9]\\d{4}[^0-9]", txt))  

дает

[[1]]
[1] "(2020)" "(1998)" "(2015)"

, и если мы заключим его в lengths( ... ), мы получим правильный ответ

Изменить : или если вам действительно нужен только счетчик, мы можем сократить его до

lengths(gregexpr("[^0-9]\\d{4}[^0-9]", txt)) 
2 голосов
/ 29 мая 2020

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

stringr::str_extract_all(txt, '(?<=\\()\\d+(?=\\))')[[1]]
#[1] "2020" "1998" "2015"

Если вы хотите подсчитать, сколько присутствует, используйте length поверх него.

length(stringr::str_extract_all(txt, '(?<=\\()\\d+(?=\\))')[[1]])
#[1] 3

Наверное, проще использовать str_match_all

stringr::str_match_all(txt, '\\((\\d+)\\)')[[1]][, 2]
#[1] "2020" "1998" "2015"
1 голос
/ 29 мая 2020

Я думаю, вы ищете stringr::str_count():

str_count(txt, "\\([0-9]{4}\\)")
[1] 3

Чтобы включить только четыре цифры в скобках, которые также начинаются с 1 или 2, за которыми следует 0 или 9:

str_count(txt, "\\([1-2][0|9][0-9]{2}\\)")

Строго начиная с 19 или 20:

str_count(txt, "\\(19[0-9]{2}\\)|\\(20[0-9]{2}\\)")
# In R 4.0
str_count(txt, r"(\(19[0-9]{2}\)|\(20[0-9]{2}\))")
...