繁体   English   中英

正则表达式:从多个匹配的括号中提取数字

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM