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

kmpatx3s  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(202)

我想从r中的一个字符串中提取子字符串。我用regex101测试了它,它确实提取了我想要的子字符串,但它也匹配了字符串中的每一个字符,并给了我一个矩阵列表,它试图匹配字符串中的每一个字符,但由于它只匹配了几个,我得到了很多空字符串。我只想得到匹配结果,没有列表或矩阵或其他。
我有一个参考书目,想提取每一个参考卷,一个问题或一个数字(包括以下数字,罗马和阿拉伯语)。所以它mathes卷,问题和数字1以及I或II。有时thre是多个在我的字符串以及(卷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)

字符串

tzcvj98z

tzcvj98z1#

主要问题是|之后的模式部分被一个可选的非捕获组 Package ,即使所有其他的拼写错误都被修复了,这个问题仍然需要解决。
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 demo online
图案看起来像

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


请参阅the regex demo。* 详细信息 *:

  • \b-字边界
  • (?:[Vv]ol(?:ume)?|Issue|No|Nr|nr|no|Number) - volVolvolumeVolumeIssueNoNrnrnoNumber
  • \s*-零个或多个空格
  • (?:\d+|V?I{0,3}X?L?C{0,3}D?M?)-一个或多个数字或可选的V,然后是0到3个I s,然后是可选的X,可选的L,C 0到3个,然后是可选的D和可选的M

相关问题