R中的gsub正则表达式-忽略换行符

R中的gsub正则表达式-忽略换行符,r,regex,newline,gsub,R,Regex,Newline,Gsub,这里有一个可复制的例子 S0 <- "\n3 4 5" S1 <- "\n3 5" 我不是在寻找一种方法来匹配具有根本不同模式的数字-我想知道如何使上述模式在R中工作。以下内容不适用于我 gsub("([^\\\n])(\\s{1})?", "\\1", S0) gsub("([^[\\\]n])(\\s{1})?", "\\1", S1) 输出应该是 #S0 - 345 #S1 - 3 5 有几个问题。在S对象中不是反斜杠(它是转义运算符而不是字符),并且有一个预定义的数

这里有一个可复制的例子

S0 <- "\n3 4 5"
S1 <- "\n3   5"
我不是在寻找一种方法来匹配具有根本不同模式的数字-我想知道如何使上述模式在R中工作。以下内容不适用于我

gsub("([^\\\n])(\\s{1})?", "\\1", S0)
gsub("([^[\\\]n])(\\s{1})?", "\\1", S1)
输出应该是

#S0 - 345
#S1 - 3 5

有几个问题。在S对象中不是反斜杠(它是转义运算符而不是字符),并且有一个预定义的数字字符类,可以对其求反:

gsub("[^[:digit:]]", "", S)
[1] "345"
另一方面,如果要排除换行符和空格,可以通过删除其中一个转义运算符来完成,因为除了字符类上下文中存在的一小组特殊字符外,不需要它们:

gsub("[\n ]", "", S)
[1] "345"

有几个问题。在S对象中不是反斜杠(它是转义运算符而不是字符),并且有一个预定义的数字字符类,可以对其求反:

gsub("[^[:digit:]]", "", S)
[1] "345"
另一方面,如果要排除换行符和空格,可以通过删除其中一个转义运算符来完成,因为除了字符类上下文中存在的一小组特殊字符外,不需要它们:

gsub("[\n ]", "", S)
[1] "345"

由于您特别希望正则表达式工作,因此可以匹配并可选
\n
(使用
(\n)?
):


请注意,如果您使用regex测试仪,例如:它在没有额外的
“(\n)?”
的情况下工作,那么您是对的。但是,我认为在R中,您必须匹配更多的捕获组才能正常工作。

因为您特别希望正则表达式正常工作,所以您可以匹配和可选的
\n
(使用
(\n)?
):

请注意,如果您使用regex测试仪,例如:它在没有额外的
“(\n)?”
的情况下工作,那么您是对的。然而,我认为在R中,您必须匹配更多的捕获组才能正常工作。

您的
([^\\n])(\s{1})?
regex101(PCRE)中的模式与
gsub
中使用的相同模式匹配不同的字符串,而不使用
perl=TRUE
(也就是说,当它由TRE regex库处理时)。如果您使用
perl=TRUE
并使用
gsub(([^\\\n])(\\s{1})“,“\\1”,S1,perl=TRUE)
,则它们的工作原理相同

有什么特别之处

带有PCRE选项的正则表达式测试仪中的此模式匹配:

  • ([^\\n])
    -除
    \
    n
    以外的任何字符(放入第1组)
  • (\s{1})
    -将任何单个空格字符匹配并捕获到组2中,可以选择1次或0次
注意:此模式与第一个捕获组不匹配任何非换行字符,如果它是
[^\n]
,它将匹配任何非换行字符

现在,将使用带有
gsub
的相同正则表达式

gsub("([^\n])(\\s{1})?", "\\1", S1)               # OR
gsub("([^\\\\n])(\\s{1})?", "\\1", S1, perl=TRUE)
为什么反斜杠的数量不同?因为第一个正则表达式是用TRE regex库处理的,并且在这些模式中,在括号表达式中,没有正则表达式转义被解析成这样,所以
\
n
被视为两个单独的字符。在PCRE模式中,具有
perl=TRUE
的模式和
[…]
的模式被称为字符类,在它们内部,您可以定义正则表达式转义,因此
\
正则表达式转义字符应该加倍(也就是说,在R字符串文本中,它应该是原来的四倍,因为您需要一个
\
来转义
\
,以便R引擎“看到”反斜杠)

实际上,如果您想匹配换行符,只需在正则表达式模式中使用
\n
,您可以使用
“\n”
“\\n”
作为TRE和PCRE正则表达式引擎解析LF和
\n
正则表达式作为换行符匹配模式。这四个是等效的:

gsub("\n([^\n])(\\s{1})?", "\\1", S1)
gsub("\\n([^\n])(\\s{1})?", "\\1", S1)
gsub("\n([^\\\\n])(\\s{1})?", "\\1", S1, perl=TRUE)
gsub("\\n([^\\\\n])(\\s{1})?", "\\1", S1, perl=TRUE)
如果
\n
必须是可选的,只需在其后面添加
量词,无需使用组将其包装:

gsub("\n?([^\n])(\\s{1})?", "\\1", S1)
        ^
并进一步简化:

gsub("\n?([^\n])\\s?", "\\1", S1)
而且,如果通过
[^\n]
您想要匹配除换行符以外的任何字符,只需使用
(?n)
内联修饰符:

gsub("(?n)(.)(\\s{1})?", "\\1", S1)
请参阅。

您的
([^\\n])(\s{1})
模式在regex101(PCRE)中与
gsub
中使用的相同模式匹配不同的字符串,而不使用
perl=TRUE
(也就是说,当它由TRE regex库处理时)。如果您使用
perl=TRUE
并使用
gsub([^\\\n])({1}),它们的工作原理相同,S1,perl=TRUE)

有什么特别之处

带有PCRE选项的正则表达式测试仪中的此模式匹配:

  • ([^\\n])
    -除
    \
    n
    以外的任何字符(放入第1组)
  • (\s{1})
    -将任何单个空格字符匹配并捕获到组2中,可以选择1次或0次
注意:此模式与第一个捕获组不匹配任何非换行字符,如果它是
[^\n]
,它将匹配任何非换行字符

现在,将使用带有
gsub
的相同正则表达式

gsub("([^\n])(\\s{1})?", "\\1", S1)               # OR
gsub("([^\\\\n])(\\s{1})?", "\\1", S1, perl=TRUE)
为什么反斜杠的数量不同?因为第一个正则表达式是用TRE-regex库处理的,在这些模式中,在括号表达式中,没有正则表达式被解析为这样,所以
\
n
被视为两个单独的字符。在PCRE模式中,
perl=TRUE
的一个,
[…]
被称为字符类,在它们内部,您可以定义正则表达式转义,因此
\
正则表达式转义字符应该加倍(也就是说,在R字符串文本内部,它应该加倍,因为您需要
\
来转义
\
,以便R引擎“看到”反斜杠)

实际上,如果您想匹配换行符,只需在正则表达式模式中使用
\n
,您可以使用
“\n”
“\\n”
作为TRE和PCRE正则表达式引擎解析LF和
\n
正则表达式作为换行符匹配模式。这四个是等效的:

gsub("\n([^\n])(\\s{1})?", "\\1", S1)
gsub("\\n([^\n])(\\s{1})?", "\\1", S1)
gsub("\n([^\\\\n])(\\s{1})?", "\\1", S1, perl=TRUE)
gsub("\\n([^\\\\n])(\\s{1})?", "\\1", S1, perl=TRUE)
如果
\n
必须是可选的,只需