正则表达式 - 贪心匹配?

时间:2014-01-21 15:23:40

标签: regex r

我试图通过剥离可选的尾随字符串来提取前导字符串,其中尾随字符串是可能的前导字符串的子集,但反之亦然。假设前导字符串类似[a-z]+,尾随字符串类似于c。因此,来自" abc"我想提取" ab"和#34; ab"我也想得到" ab"。像这样:

^([a-z]+)(?:c|)

问题是[a-z]+匹配整个字符串,使用替代中的空选项,因此抓取的值为&#34; abc&#34;或&#34; ab&#34;。 ((?:告诉它不要抓住第二部分。)我想要一些方法让它采用更长的选项,或替代的第一个选项,并使用它来确定匹配第一部分。< / 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;。)

4 个答案:

答案 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"