r - 无法弄清楚为什么正则表达式组在 str_match 中不起作用
问题描述
我有以下带有正则表达式的代码
CHARACTER <- ^([A-Z0-9 .])+(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$
str_match("WILL (V.O.)",CHARACTER)[1,2]
我认为这应该与“WILL”的值匹配,但它返回空白。我用另一种语言尝试了 RegEx,在这种情况下,该组也返回空白。
我必须在这个正则表达式中添加什么才能只撤回值“WILL”?
解决方案
您通过放置在组外形成了一个重复的捕获+
组。放回去:
CHARACTER <- "^([A-Z0-9 .]+)(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$"
^
Will
请注意,如果您在组之后使用惰性匹配,则可以修剪\s*
:
CHARACTER <- "^([A-Z0-9\\s.]+?)\\s*(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$"
请参阅此正则表达式演示。
> library(stringr)
> CHARACTER <- "^([A-Z0-9\\s.]+?)\\s*(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$"
> str_match("WILL (V.O.)",CHARACTER)[1,2]
[1] "WILL"
或者,您可以只提取 Will
> str_extract("WILL (V.O.)", "^.*?(?=\\s*(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$)")
[1] "WILL"
或与基础 R 相同:
> regmatches(x, regexpr("^.*?(?=\\s*(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$)", x, perl=TRUE))
[1] "WILL"
这里,
^
- 匹配字符串的开头.*?
- 尽可能少的除换行符以外的任何 0+ 字符(?=\\s*(?:\\(V\\.O\\.\\))?(?:\\(O\\.S\\.\\))?(?:\\(CONT'D\\))?$)
- 确保在当前位置的右侧,有\\s*
- 0+ 个空格(?:\\(V\\.O\\.\\))?
- 一个可选的(V.O.)
子字符串(?:\\(O\\.S\\.\\))?
- 一个可选的(O.S.)
子字符串(?:\\(CONT'D\\))?
- 一个可选的(CONT'D)
子字符串$
- 字符串结束。
推荐阅读
- blazor - Blazor StateHasChanged() 在用户尝试编辑网格时刷新组件
- visual-studio-code - VSCode 是否有快速跳转到下一个差异的键盘快捷键?
- tensorflow - 使用 Class_weight 和 loss _weight
- amazon-web-services - 在 serverless 中创建 S3 存储桶策略和 cors 配置 - 如何在 serverless.yml 中正确编写策略
- vuejs2 - 创建 JS 文件并从中导入 Vue 组件
- sql - 选择必须针对每个 id 只返回一行
- pandas - 如何将外部时间序列数据分组在一起
- android - 如何为 android makefile 制作 openconnect 应用程序?
- python - 仅使用一维索引多维张量
- c++ - 带有 libxslt 的 XSLT 扩展功能