Regex не захватывает числа, записанные в виде слов - PullRequest
3 голосов
/ 23 сентября 2019

Я смотрю на Оливера Твиста на английском и французском.Я нашел этот сайт (https://cran.r -project.org / web / packages / tidytext / vignettes / tidytext.html ), который предоставляет код для применения номера главы к строке текста.Когда я применяю его к тексту на английском языке, он работает просто отлично:

library(gutenbergr)
library(dplyr)
library(tidytext)
library(stringr)
twistEN <- gutenberg_download(730)
twistEN <- twistEN[118:nrow(twistEN),]
chaptersEN <- twistEN %>%
  mutate(line = row_number(), chapter = cumsum(str_detect(text, regex("^chapter [\\divxlc]", ignore_case = TRUE)))) %>%
  ungroup()

Когда я затем смотрю на главыEN, я вижу, что он соответствующим образом применяет номер главы в каждой строке.Где я сталкиваюсь с неприятностями, так это с французским текстом.Вот мой код:

twistFR <- gutenberg_download(16023)
twistFR <- twistFR[123:nrow(twistFR),]
twistFR$text <- iconv(twistFR$text, "latin1", "UTF-8")
chaptersFR <- twistFR %>%
  mutate(line = row_number(), chapter = cumsum(str_detect(text, regex("^chaptitre [\\divxlc]", ignore_case = TRUE)))) %>%
  ungroup()

Проблема здесь в том, что главы не называются Глава 1 и Глава 2, они называются Chapitre Premier, Chapitre Deuxieme.Я полагаю, что регулярное выражение находит номер главы, посмотрев на число после слова глава (пожалуйста, исправьте меня, если я ошибаюсь), поэтому оно не знает, что делать, когда эта цифра записана в виде слова.Любые идеи о том, как применить номер главы?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

В этом случае достаточно сопоставления строк, начинающихся с заглавной буквы 'CHAPITRE'.

chaptersFR <- twistFR %>%
  mutate(line = row_number(), chapter = cumsum(str_detect(text, regex("^CHAPITRE")))) %>%
  ungroup()

chaptersFR %>% 
  filter(grepl("^chapitre", text, ignore.case = TRUE)) %>%
  head(5)

# A tibble: 5 x 4
  gutenberg_id text               line chapter
         <int> <chr>             <int>   <int>
1        16023 CHAPITRE PREMIER.     1       1
2        16023 CHAPITRE II         124       2
3        16023 CHAPITRE III        604       3
4        16023 CHAPITRE IV.       1006       4
5        16023 CHAPITRE V.        1333       5

chaptersFR %>% 
  filter(grepl("^chapitre", text, ignore.case = TRUE)) %>%
  tail(5)

# A tibble: 5 x 4
  gutenberg_id text                                                            line chapter
         <int> <chr>                                                          <int>   <int>
1        16023 CHAPITRE L.                                                    18443      50
2        16023 CHAPITRE LI.                                                   18973      51
3        16023 chapitre, Olivier se trouvait, à trois heures de l'après-midi, 18979      51
4        16023 CHAPITRE LII                                                   19580      52
5        16023 CHAPITRE LIII.                                                 19989      53
0 голосов
/ 23 сентября 2019

Короткий ответ: вы написали chaptitre вместо chapitre

Для чего вы используете в коде часть [\\divxlc]?
Например: ^chapitre [\\divxlc]
^ означает в начале строки
chapitre соответствует только слово chapitre (только нижний регистр)
пустое поле соответствует пробелу
и часть [\\divxlc] соответствует только '\', 'd', 'i', 'v', 'x', 'l' или 'c'

Так что это может соответствовать следующим примерам: chapitre d , chapitre i или chapitre \

И если вы хотите, чтобы c в начале главы был прописными или строчнымиможет использовать это:
^[cC]hapitre [\\divxlc]

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