r - R中的正则表达式来检测三个单词的组合和这些单词的变体
问题描述
我在正则表达式方面不是很有经验,所以我正在伸出援手。如果这是一个重复的问题,请指出我的其他回答。
我的字符串包含三个分组的单词。这三个词可以在每个组中以任何顺序出现。这些词代表零件编号及其修订,可能会出现单词“rev”(简称:修订)的变体。修订版也可能不存在。三个字中的两个同属一个:如果有两个 7 位数字,则必须有两个修订!
业务背景:我们有一个工程变更数据库,有些变更只包含正在变更的零件的零件编号。相关的修订在描述字段中。通常,描述包含部件号和修订以及其他文本。我需要从描述中找出零件的修订版本。
匹配 我需要返回部件号及其相关修订。
字
- 7 位数字,例如 1234567
- “REV”一词的变体:REV、Rev、rev、Rev. 等),长度为 3 或 4 个字符(如果是 4 个字符,则第 4 个字符始终是一个点)。这个词是可选的。
- 一个字母后跟 2 个数字:例如 A00、B02、C00 7 位字 (1234567) 和修订 (AOO) 总是成对出现,可能以混合顺序出现。首字母缩略词“REV”及其变体是可选的。
简单和最常见的情况
这三个单词以任意顺序出现一次。单词之间可以有空格,也可以有逗号、冒号、其他文本或其组合。“REV”和变体是可选的。
更复杂的案例
这三个单词以混合顺序多次出现。现实世界组合的例子:
1234567 版本 A00 7654321 B00 版本 C00 1357913 1337335 版本 A00、1337336
1234567 Rev A00一些随机文本7654321 B00 Rev C00 1357913 1337335 Rev A00
1337336 修订版 A00、1337338 修订版 A00 和 1337339 修订版 A00
1281660 A01、1281661 B00、1281839 A01
A01 1281660 1281661 B00 A01 1281839
修订版 A01 1281660,修订版。B00 1281661、1281839 A01
但是破坏组的组合是不可能的。例如:
- 1281660 1281661 版本 A01 版本 B00
- 版本 A00、版本 B00、1234567、7654321
- 1234567 修订版 A00 7654321 B00 C00
是不可能的(如果他们愿意,我想忽略它们)。换句话说:如果有一个 7 位的字符串,它后面必须跟一个修订版。如果有两个相邻的 7 位字符串,则前后必须有一个修订。等等
我希望这足够清楚。乐于使用base
正则表达式或例如stringr
函数。您的帮助将不胜感激。
更新 一些更明确的说明,使用括号表示组,并使用字母 A(7 位字符串)、B(字符串“REV”和变体)和 C (A00) 表示单词。现实的组合,注意 A 和 C 必须存在于一个组中:
- (ABC) 或 (CBA) 或 (BAC) 或 (AC) 或 (CA) 等。B 是可选的。
- (ABC)(CBA) 或 (AC)(BAC) 或 (CBA)(AC) 或 (AC)(CBA)
- (AC)(CA)(AC)
- 等等
不可能的组合:
- (AAB)
- (BA) 或 (BA)
- (ABB)(交流)
- 等等
A 的出现必须在同一组中看到 C。一个 A 不能与多个 B 或 C 相关联。我想如果我们完全忽略 B,这个问题可以简化。
解决方案
您可以尝试查找“字母 + 2 位”+“7 位”或交换相同内容的正则表达式。对于提供的示例,此方法有效:
s = "1234567 Rev A00 7654321 B00 Rev C00 1357913 1337335 Rev A00, 1337336
1234567 Rev A00 some random text 7654321 B00 Rev C00 1357913 1337335 Rev A00
1337336 Rev A00, 1337338 Rev. A00, and 1337339 REV A00
1281660 A01, 1281661 B00,1281839 A01
A01 1281660 1281661 B00 A01 1281839
Rev A01 1281660, REV. B00 1281661, 1281839 A01"
library(stringr)
z = str_match_all(s, "([A-Z]\\d{2}.+?\\d{7}|\\d{7}.+?[A-Z]\\d{2})")
这将返回:
> z
[[1]]
[,1] [,2]
[1,] "1234567 Rev A00" "1234567 Rev A00"
[2,] "7654321 B00" "7654321 B00"
[3,] "C00 1357913" "C00 1357913"
[4,] "1337335 Rev A00" "1337335 Rev A00"
[5,] "1234567 Rev A00" "1234567 Rev A00"
[6,] "7654321 B00" "7654321 B00"
[7,] "C00 1357913" "C00 1357913"
[8,] "1337335 Rev A00" "1337335 Rev A00"
[9,] "1337336 Rev A00" "1337336 Rev A00"
[10,] "1337338 Rev. A00" "1337338 Rev. A00"
[11,] "1337339 REV A00" "1337339 REV A00"
[12,] "1281660 A01" "1281660 A01"
[13,] "1281661 B00" "1281661 B00"
[14,] "1281839 A01" "1281839 A01"
[15,] "A01 1281660" "A01 1281660"
[16,] "1281661 B00" "1281661 B00"
[17,] "A01 1281839" "A01 1281839"
[18,] "A01 1281660" "A01 1281660"
[19,] "B00 1281661" "B00 1281661"
[20,] "1281839 A01" "1281839 A01"
执行z[[1]][,1]
以返回第一列。
您可以在此 Regex101中尝试更多案例(它在 PHP 中,但唯一的区别是在 R 中您需要双反斜杠\\
而不是一个\
)。
推荐阅读
- spring - 春季无法使用 RestTemplate 调用 HTTPS 服务
- python - Langdetect:文本中没有特征
- amazon-web-services - 对现场车队请求执行标签
- python - 如何根据列值对 pandas DF 应用过滤器
- msal - 为什么当我从登录返回到示例应用程序时出现错误?
- python-3.x - 如何从 pool.map() 中的所有进程中获取变量值?
- c# - 在 C# 中使用 SQLite 进行 Dapper 查询会引发错误“'必须为以下参数添加值”
- python - 使用 Django REST 和 pyjwt 登录时出现“预期的字符串值”
- node.js - 为什么 Stripe API 会输出“请求指标缓冲区已满,正在丢弃遥测消息。”?
- reactjs - 在 React 自定义钩子中正确输入 useRef 值