正则表达式不会捕获写成单词的数字

时间:2019-09-23 19:25:26

标签: r regex tidytext project-gutenberg

我正在用英语和法语看《 Oliver Twist》。我发现此站点(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()

这里的问题是这些章没有分别命名为第一章和第二章,它们分别被命名为Chapitre Premier,Chapitre Deuxieme。我相信正则表达式可以通过查看章一词后面的数字来找到章号(如果我错了,请纠正我),因此当将该数字写成单词时,它不知道该怎么办。有关如何应用章节编号的任何想法?

2 个答案:

答案 0 :(得分:0)

简短的答案:您写的是chaptitre而不是chapitre

您在代码中使用[\\divxlc]部分是什么?
例如:^chapitre [\\divxlc]
^表示在行的开头
chapitre仅与单词chapitre(仅小写)匹配
空白字段与空格匹配
[\\divxlc]部分仅匹配“ \”,“ d”,“ i”,“ v”,“ x”,“ l”或“ c”

因此它可以匹配以下示例: chapitre d chapitre i chapitre \

如果您希望chapitre开头的c为大写或小写,可以使用以下代码:
^[cC]hapitre [\\divxlc]

答案 1 :(得分:0)

在这种情况下,匹配以大写字母“ 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