我试图通过剥离可选的尾随字符串来提取前导字符串,其中尾随字符串是可能的前导字符串的子集,但反之亦然。假设前导字符串类似[a-z]+
,尾随字符串类似于c
。因此,来自" abc"我想提取" ab"和#34; ab"我也想得到" ab"。像这样:
^([a-z]+)(?:c|)
问题是[a-z]+
匹配整个字符串,使用替代中的空选项,因此抓取的值为" abc"或" ab"。 ((?:
告诉它不要抓住第二部分。)我想要一些方法让它采用更长的选项,或替代的第一个选项,并使用它来确定匹配第一部分。< / p>
我也尝试将所需目标放在两个备选方案中:
^([a-z]+)c|^([a-z]+)
我认为它应该更喜欢匹配两种可能的替代方案中的第一种,但我得到与上述相同的结果。
我在R中这样做,所以我可以使用POSIX或Perl正则表达式库。
(实际问题涉及期货交易符号。这些符号具有根&#34;工具名称&#34;如[A-Z0-9]+
,后跟&#34;到期代码&#34;如[FGHJKMNQUVXZ][0-9]{1,2}
给定像&#34; ZNH3&#34;这样的符号,我想剥离&#34; H3&#34;得到&#34; ZN&#34;。但是如果我给它&#34; ZN&#34; ;我也想回来&#34; ZN&#34;。)
答案 0 :(得分:1)
试试这个:
> library(gsubfn)
> strapplyc(c("abc", "abd"), "^(\\w+?)c?$", simplify = TRUE)
[1] "ab" "abd"
甚至更容易:
> sub("c$", "", c("abc", "abd"))
[1] "ab" "abd"
答案 1 :(得分:1)
这是一个正常的正则表达式:
vec <- c("ZNH3", "ZN", "ZZZ33", "ABF")
sub("(\\w+)[FGHJKMNQUVXZ]\\d{1,2}", "\\1", vec)
# [1] "ZN" "ZN" "ZZ" "ABF"
答案 2 :(得分:0)
对正则表达式的第一部分使用“非贪婪”匹配,然后使用“字符串结束”锚定的“可选允许后缀”的定义......
此正则表达式(.+?)([FGHJKMNQUVXZ][0-9]{1,2})?$
匹配...
(.+?)
尽可能少的字符([FGHJKMNQUVXZ][0-9]{1,2})?
后跟允许(但可选)后缀$
后跟字符串所需的结果是在匹配的第一个捕获元素中(但是可以在'r'中引用): - )
答案 3 :(得分:0)
仅使用基本代码的非贪婪答案的变体。
codes <- c("ZNH3", "CLZ4")
matched <- regmatches(codes, regexec("^([A-Z0-9]+?)[FGHJKMNQUVXZ][0-9]{1,2}$", codes))
# [[1]]
# [1] "ZNH3" "ZN"
#
# [[2]]
# [1] "CLZ4" "CL"
sapply(matched, `[[`, 2) # extract just codes
# [1] "ZN" "CL"