我正在尝试使用regexpr函数在R中使用正则表达式。我有多个条件要匹配,因此我的正则表达式实际上非常长,例如“A \ s +(\ d +)|(\ d +)\ s + A”。所以我想把每个单独的表达式放在不同的行上,比如
"A\\s+(\\d+)|
(\\d+)\\s+A|"
但它不起作用。括号告诉R我想要提取数字。谁能提出建议?
答案 0 :(得分:2)
1)粘贴尝试使用paste
:
paste("A\\s+(\\d+)",
"(\\d+)\\s+A",
sep = "|")
2)rex 另一种可能性是使用rex package
library(rex)
rex(group("A", spaces, capture(digits)) %or%
group(capture(digits), spaces, "A"))
给出:
(?:(?:A[[:space:]]+([[:digit:]]+))|(?:([[:digit:]]+)[[:space:]]+A))
3)rebus rebus package的意图相似:
library(rebus)
literal("A") %R% one_or_more(space()) %R% capture(one_or_more(ascii_digit())) %|%
capture(one_or_more(digit())) %R% one_or_more(space()) %R% literal("A")
发出:
<regex> \QA\E[[:space:]]+([0-9]+)|([[:digit:]]+)[[:space:]]+\QA\E
答案 1 :(得分:1)
只需在您使用的任何功能中使用x modifier和perl = TRUE
即可。将x修饰符((?x)
)放在表达式的开头,并忽略空格。此外,评论字符也会被忽略。
pat <- "(?x)\\\\ ## Grab a backslash followed by...
[a-zA-Z0-9]*cite[a-zA-Z0-9]* ## A word that contains ‘cite‘
(\\[([^]]+)\\]){0,2}\\** ## Look for 0-2 square brackets w/ content
\\{([a-zA-Z0-9 ,]+)\\}" ## Look for curly braces with viable bibkey
tex <- c(
"Many \\parencite*{Ted2005, Moe1999} say graphs \\textcite{Few2010}.",
"But \\authorcite{Ware2013} said perception good too.",
"Random words \\pcite[see][p. 22]{Get9999c}.",
"Still more \\citep[p. 22]{Foo1882c}?"
)
gsub(pat, "", tex, perl=TRUE)
## [1] "Many say graphs ." "But said perception good too."
## [3] "Random words ." "Still more ?"
第二种方法......我维护了一个名为regexr的包,试图启用正则表达式库的维护者:
以类似于R代码编写方式的方式编写正则表达式。
如果您没有平移表达式的长期维护,但是你可以用 regexr (不需要perl = TRUE
)做同样的事情,这可能会有点过头了。请注意最小注释,因为与子表达式名称共享含义。 %:)%
是注释运算符(注释代码是快乐代码),但您无需使用前导名称或注释,只需construct
。:
library(regexr)
pat2 <- construct(
backslash = "\\\\" %:)% "\\",
cite_command = "[a-zA-Z0-9]*cite[a-zA-Z0-9]*" %:)% "parencite",
square_brack = "(\\[([^]]+)\\]){0,2}\\**" %:)% "[e.g.][p. 12]",
bibkeys = "\\{([a-zA-Z0-9 ,]+)\\}" %:)% "{Rinker2014}"
)
gsub(pat2, "", tex)
## [1] "Many say graphs ." "But said perception good too."
## [3] "Random words ." "Still more ?"
regexr 框架工作需要一些前期时间,但“代码”更容易维护,更模块化,更容易理解,而无需学习新的“语言”。这是许多方法中的一种,我倾向于使用标准正则表达式, regexr 和 rebus (在 regexr 框架内工作)的组合。例如,我们可以使用pat2
函数从subs
中获取任何子表达式,如下所示:
subs(pat2)
## $backslash
## [1] "\\\\"
##
## $cite_command
## [1] "[a-zA-Z0-9]*cite[a-zA-Z0-9]*"
##
## $square_brack
## [1] "(\\[([^]]+)\\]){0,2}\\**"
##
## $bibkeys
## [1] "\\{([a-zA-Z0-9 ,]+)\\}"
我还提供了简单的方法来测试perl有效性的主要和子表达式,如下所示:
test(pat2)
## $regex
## [1] TRUE
##
## $subexpressions
## backslash cite_command square_brack bibkeys
## TRUE TRUE TRUE TRUE
答案 2 :(得分:0)
如果您希望将字符串文字拆分为脚本中的几行,则一种解决方案是使用paste0
:
my_expr <- paste0('partone',
'parttwo',
'partthree')
然后你得到了想要的结果:
> my_expr
[1] "partoneparttwopartthree"
你不能将它分成引号之间的几行,b / c然后新行字符是表达式的一部分。
如果您还试图解决正则表达式问题,则需要发布您尝试使用的数据样本以及所需的结果