R--新行中的正则表达式

时间:2015-02-24 18:07:40

标签: regex r

我正在尝试使用regexpr函数在R中使用正则表达式。我有多个条件要匹配,因此我的正则表达式实际上非常长,例如“A \ s +(\ d +)|(\ d +)\ s + A”。所以我想把每个单独的表达式放在不同的行上,比如

"A\\s+(\\d+)|
(\\d+)\\s+A|"

但它不起作用。括号告诉R我想要提取数字。谁能提出建议?

3 个答案:

答案 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 modifierperl = 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然后新行字符是表达式的一部分。

如果您还试图解决正则表达式问题,则需要发布您尝试使用的数据样本以及所需的结果