Regex не фиксирует числа, записанные как слова

Я смотрю на Оливера Твиста на английском и французском языках. Я нашел этот сайт ( 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()

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

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. Я считаю, что регулярное выражение находит номер главы, глядя на цифру, следующую за словом chapter (поправьте меня, если я ошибаюсь), поэтому оно не знает, что делать, если эта цифра записана как слово. Есть идеи, как применить номер главы?

2 ответа

Решение

В этом случае достаточно сопоставления строк, которые начинаются с заглавной буквы "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

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

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

Таким образом, он может соответствовать этим примерам:chapitre d, chapitre i или chapitre \

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

Другие вопросы по тегам