在r中用正则表达式提取子字符串,用矩阵输出列表

问题描述 投票:0回答:1

我想从 r 中的字符串中提取子字符串。我用 regex101 测试了它,它确实提取了我想要的子字符串,但它也匹配字符串中的每个其他字符,并为我提供了一个带有矩阵的列表,其中它尝试匹配字符串中的每个字符,但因为它只匹配几个,我得到很多空字符串。我只想要匹配结果,不需要列表或矩阵或其他。

我有一个参考书目,想要提取对一卷、一期或一个数字的所有引用(包括以下数字,罗马数字和阿拉伯数字)。因此,它对卷、期和编号 1 以及 I 或 II 进行数学计算。有时我的字符串中也会有多个这样的字符串(第 3 卷,第 2 期)。 谁能告诉我为什么它检查每个字符?

这是我到目前为止的代码:

string <- 'ABC  (2013c), Something Something Text (Volume II): Some more blabla, the usual, end of string'

pattern <- "[V|v]ol(?:ume)?\\s*(\\d+|(V?I{0,3}X?L?C{0,3}D?M?))|(?:\\s+(Issue|No|Nr|nr|no|Number)\\s*(\\d+|V?I{0,3}X?L?C{0,3}D?M?))?"
  matches <- str_match_all(string , pattern)
r regex stringr
1个回答
0
投票

主要问题是

|
之后的模式部分被可选的非捕获组包裹,即使所有其他拼写错误都已修复,该问题仍然需要解决。

OR 运算符两端的数字匹配部分是相同的,因此您可以将两种选择合并为一个并简单地使用

string <- 'ABC  (2013c), Something Something Text (Volume II): Some more blabla, the usual, end of string'
 
rx <- paste0("\\b(?:[Vv]ol(?:ume)?|Issue|No|Nr|nr|no|Number)\\s*(?:\\d+|V?I{0,3}X?L?C{0,3}D?M?)")
library(stringr)
str_extract_all(string, rx)
## => [[1]]
##    [1] "Volume II"

在线观看 R 演示

图案看起来像

\b(?:[Vv]ol(?:ume)?|Issue|No|Nr|nr|no|Number)\s*(?:\d+|V?I{0,3}X?L?C{0,3}D?M?)

请参阅正则表达式演示详情

  • \b
    - 单词边界
  • (?:[Vv]ol(?:ume)?|Issue|No|Nr|nr|no|Number)
    -
    vol
    Vol
    volume
    Volume
    Issue
    No
    Nr
    nr
    no
    Number 
  • \s*
    - 零个或多个空格
  • (?:\d+|V?I{0,3}X?L?C{0,3}D?M?)
    - 一位或多位数字或可选的
    V
    ,然后是零到三个
    I
    ,然后是可选的
    X
    ,可选的
    L
    ,C 出现零到 3 次,然后是可选的
    D 
    和可选的
    M
© www.soinside.com 2019 - 2024. All rights reserved.