R语言正则表达式评估咨询:附代码片段
评估R语言中正则表达式的匹配效果
咱们先拆解一下你写的这个正则表达式,搞清楚它到底在匹配什么:
rr <- regex("^chapter [\\divxlc]", ignore_case = T)
^:锚定字符串的开头,也就是说只有当"chapter "出现在字符串最前面时才会匹配chapter:匹配"chapter"加上一个空格,ignore_case = T参数让匹配不区分大小写,所以Chapter、CHAPTER、cHaPtEr这些写法都能被匹配到[\\divxlc]:这是一个字符集合,匹配其中任意单个字符:\\d:代表任意数字(0-9)i、v、x、l、c:对应罗马数字的单个字符(分别代表1、5、10、50、100),同样因为忽略大小写,I、V、X等大写形式也能匹配
接下来咱们用代码实际评估它的匹配效果,结合你提供的数据框,我们可以添加列来标记是否匹配,以及提取具体匹配的部分:
# 加载需要的包 library(stringr) library(dplyr) # 你的原代码 rr <- regex("^chapter [\\divxlc]", ignore_case = T) dd <- c("hello there", "Chapter 1", "begining of life", "end of chapter", "Chapter X", "Chapter T", "Chapter 10") dd_df <- data_frame(line=1:length(dd), text = dd) # 添加匹配结果列 dd_df <- dd_df %>% mutate( 是否匹配 = str_detect(text, rr), # 检测是否存在匹配 匹配内容 = str_extract(text, rr) # 提取具体匹配的部分 ) # 查看结果 print(dd_df)
运行这段代码后,你会得到这样的结果:
# A tibble: 7 × 4 line text 是否匹配 匹配内容 <int> <chr> <lgl> <chr> 1 1 hello there FALSE NA 2 2 Chapter 1 TRUE Chapter 1 3 3 begining of life FALSE NA 4 4 end of chapter FALSE NA 5 5 Chapter X TRUE Chapter X 6 6 Chapter T FALSE NA 7 7 Chapter 10 TRUE Chapter 1
咱们来逐个分析每一行的匹配情况:
- 第1行:
hello there→ 不匹配,因为字符串开头不是"chapter " - 第2行:
Chapter 1→ 匹配,1属于数字集合,匹配完整的Chapter 1 - 第3行:
begining of life→ 不匹配,和开头的锚定条件不符 - 第4行:
end of chapter→ 不匹配,虽然有"chapter"但不在字符串开头 - 第5行:
Chapter X→ 匹配,X属于字符集合里的x(忽略大小写),匹配完整的Chapter X - 第6行:
Chapter T→ 不匹配,T不在[\divxlc]这个字符集合里 - 第7行:
Chapter 10→ 注意这里,正则只匹配到Chapter 1,因为[\divxlc]只能匹配单个字符,所以虽然整个字符串开头符合,但只提取了第一个数字。如果你的需求是匹配多位数字或者完整的罗马数字,这个正则就需要调整啦~
内容的提问来源于stack exchange,提问作者Mutaz-MSFT
相关产品推荐
相关产品推荐

