正则表达式不捕获写成单词的数字
Regex doesn't capture numbers written out as words
我正在看英文版和法文版的雾都孤儿。我发现这个站点 (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。我相信正则表达式是通过查看单词章节后面的数字来找到章节编号的(如果我错了请纠正我),所以当该数字作为单词写入时它不知道该怎么做。关于如何应用章节号有什么想法吗?
简短的回答:你写的是 chaptitre 而不是 chapitre
您将代码中的 [\divxlc]
部分用于什么目的?
例如:^chapitre [\divxlc]
^
表示在一行的开头
chapitre
仅匹配单词 chapitre(仅小写)
</code>空白字段匹配 space<br>
<code>[\divxlc]
部分仅匹配 '\'、'd'、'i'、'v'、'x'、'l' 或 'c'
所以它可以匹配这些例子:
章节 d、章节 i 或 章节 \
如果你希望 chapitre 开头的 c 是大写或小写,你可以使用这个:
^[cC]hapitre [\divxlc]
在这种情况下,匹配以大写 '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
我正在看英文版和法文版的雾都孤儿。我发现这个站点 (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。我相信正则表达式是通过查看单词章节后面的数字来找到章节编号的(如果我错了请纠正我),所以当该数字作为单词写入时它不知道该怎么做。关于如何应用章节号有什么想法吗?
简短的回答:你写的是 chaptitre 而不是 chapitre
您将代码中的 [\divxlc]
部分用于什么目的?
例如:^chapitre [\divxlc]
^
表示在一行的开头
chapitre
仅匹配单词 chapitre(仅小写)
</code>空白字段匹配 space<br>
<code>[\divxlc]
部分仅匹配 '\'、'd'、'i'、'v'、'x'、'l' 或 'c'
所以它可以匹配这些例子: 章节 d、章节 i 或 章节 \
如果你希望 chapitre 开头的 c 是大写或小写,你可以使用这个:
^[cC]hapitre [\divxlc]
在这种情况下,匹配以大写 '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