【发布时间】:2018-06-04 20:43:28
【问题描述】:
我的问题与使用 If-Then-Else 条件和 str_extract 的正则表达式中的前瞻和后视构造有关。
我在下表中有一个名为 UNIT 的字符串,需要将其分解为 3 个组成部分。格式是非标准的,我使用 regex 和 str_extract 为每个组件创建新列。
我可以很容易地提取字符串的开头(3A、3C 等)和结尾(E、A),但中间部分有点困难。它可以是 1-3 位数字,也可以是 SK、SD 或 HH 的两个字符代码。我可以单独使用下面的代码,但后一行会覆盖前一行。
那么,我的问题是,如何将正则表达式中的 If-Then-Else 条件 (?(?=regex)then|else) 与 str_extract 结合使用以从 df1 获取 df2?
df1$C2 = str_extract(df1$UNIT,"(?<=[:upper:])\\d*(?<![:upper:])")
df1$C2 = str_extract(df1$UNIT, "S.$")
df1
ID UNIT
1 3ASD
2 3C14E
3 3D5E
4 3E15E
5 3ESK
6 3B14A
7 3BHHQ2
8 3E101
df2
ID UNIT C1 C2 C3
1 3ASD 3A SD NA
2 3C14E 3C 14 E
3 3D5E 3D 5 E
4 3E15E 3E 15 E
5 3ESK 3E SK NA
6 3B14A 3B 14 A
7 3BHHQ2 3B HH Q2
8 3E101 3E 101 NA
【问题讨论】:
-
准确地说:C2 值只能是 3 个值中的 1 个,SK、SD 或 HH,还是 1-3 位? C1值是数字+大写?而 C3 是 1 个可以丢失的大写字母?
-
@WiktorStribiżew C2 值可以是 1-3 位数字(例如 5、55、555)或 SK、SD、HH 三个字符对。字符对是 C2 中唯一的字符类型。正确,C3 是一种可能会丢失的大写字母。
-
嗯,C3 可以是字母+数字,#7 是
Q2。对?我想你可以用str_match,试试str_match(df$UNIT, "^([0-9][[:upper:]])([0-9]{1,3}|S[KD]|HH)([[:upper:]][0-9]*)?$") -
@WiktorStribiżew 该代码有效,但未获得 df2 中显示的所需产品。我解决了问题并将发布。
-
那里有什么不同?您没有提供可重现的示例,我自己构建了 DF,并且由于您没有提供确切的规格,因此正则表达式与值匹配。
标签: r regex if-statement regex-lookarounds stringr