[英]Regex: Extracting numbers from parentheses with multiple matches
我如何匹配年份,以便它适用于以下示例。
a <- '"You Are There" (1953) {The Death of Socrates (399 B.C.) (#1.14)}'
b <- 'Þegar það gerist (1998/I) (TV)'
我尝试了以下,但没有取得最大的成功。
gsub('.+\\(([0-9]+.+\\)).?$', '\\1', a)
我认为它做的是直到它找到一个(然后它会产生一组数字,然后是任何字符,直到它遇到a)。 如果有几个匹配,我想提取第一组。
对我出错的地方有什么建议吗? 我一直在做这个。
你可以用
library(stringr)
strings <- c('"You Are There" (1953) {The Death of Socrates (399 B.C.) (#1.14)}', 'Þegar það gerist (1998/I) (TV)')
years <- str_match(strings, "\\((\\d+(?: B\\.C\\.)?)")[,2]
years
# [1] "1953" "1998"
这里的表达是
\( # (
(\d+ # capture 1+ digits
(?: B\.C\.)? # B.C. eventually
)
请注意,反斜杠需要在R
进行转义。
你的模式包含.+
尽可能多地匹配1个或多个字符的部分,最多你的模式可以从传入的字符串中获取最后4位数字块。
你可以用
^.*?\((\d{4})(?:/[^)]*)?\).*
替换为\\1
仅保留4位数字。 请参阅正则表达式演示 。
细节
^
- 字符串的开头 .*?
- 尽可能少的任何0+字符 \\(
- (
(\\d{4})
- 第1组:四位数 (?:
- 可选的非捕获组的开始
/
- 一个/
[^)]*
- 除了以外的任何0+字符)
)?
- 小组结束 \\)
- a )
(可选,可能省略) .*
- 字符串的其余部分。 看R演示 :
a <- c('"You Are There" (1953) {The Death of Socrates (399 B.C.) (#1.14)}', 'Þegar það gerist (1998/I) (TV)', 'Johannes Passion, BWV. 245 (1725 Version) (1996) (V)')
sub("^.*?\\((\\d{4})(?:/[^)]*)?\\).*", "\\1", a)
# => [1] "1953" "1998" "1996"
另一个基本R解决方案是匹配4位数后(
:
regmatches(a, regexpr("\\(\\K\\d{4}(?=(?:/[^)]*)?\\))", a, perl=TRUE))
# => [1] "1953" "1998" "1996"
\\(\\K\\d{4}
模式匹配(
然后由于\\K
匹配重置运算符而丢弃它,然后是(?=(?:/[^)]*)?\\\\))
预测确保存在可选/
+ 0+字符以外)
,然后一个)
。 请注意, regexpr
仅提取第一个匹配项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.