【问题标题】:grep \s returning blank [duplicate]grep \s 返回空白[重复]
【发布时间】:2018-04-13 14:04:35
【问题描述】:

语言:R,IDE:R Studio

我正在编写一个脚本来从 pdf 文件(又名大字符串)中提取和排除特定信息。我使用 grep 将字符串拆分为我想要的页面。我希望进一步瘦身。我更瘦的脚本是...

variablename <- grep("Additional Information:(?! )", AnyAdditionalInfoPages,   
     perl = TRUE, value = TRUE)

这完全符合我的要求。但是,我是 R 和正则表达式的新手,所以我想练习并尝试了以下...

variablename <- grep("Additional Information:(?!\s)", AnyAdditionalInfoPages, 
    perl = TRUE, value = TRUE)

结果是 - 错误:'\s' is an unrecognized escape in string started ""Additional Information:(?!\s"

variablename <- grep("Additional Information:(?!\\s)", AnyAdditionalInfoPages, 
    perl = TRUE, value = TRUE)

结果是一个空变量

> variablename
character(0)

发生了什么事?为什么 " " 有效,但字符串 \s 的转义字符无效?

【问题讨论】:

  • @MoeMichaelSmith 除了您输入的内容与您的正则表达式不匹配之外,几乎不可能说任何其他内容...
  • @Dason,我原来的那个... grep("Additional Information:(?! )",完全符合我的要求。我想知道为什么要用转义字符代替空格括号中的真实空格,不起作用。“”和\s之间有什么根本区别吗?我看到的所有文档都说空格“”应该包含在\s中。
  • 我的评论试图指出您没有提供可重现的示例。尝试为我们制作一个最小的可重现示例。在这样做的过程中,我发现很多时候你可能会找出问题所在。如果您不这样做,那么至少我们将拥有带有实际数据的实际代码来说明问题。 stackoverflow.com/questions/5963269/…
  • @Dason,够公平的。我将包含一个示例,尽可能接近我正在使用的格式。在这种情况下,简单的数据使事情变得困难,而我更复杂的数据的格式则大不相同。
  • Wiktor Strib.我看了你的建议,你所谓的“完全重复”是不准确的。首先,这个问题涉及 Oracle 产品而不是正则表达式。虽然碰巧有相似之处,但这个问题的背景却大不相同。此外,答案与其他上下文中提供的答案并不遥远。请花时间阅读问题,而不是假设它是重复的。感谢 Marcus Campbell 花时间尊重我的问题,而不是立即驳回它。

标签: r regex regex-negation regex-lookarounds


【解决方案1】:

啊,这很有趣。

模式"Additional Information:(?! )" 不会选择在“:”之后包含单个空格的字符串,但使用(?!\\s) 不会选择包含任何 空白字符的字符串,例如制表符。一种可能的解释是,您正在解析的向量中有“非空格”形式的空白。

AnyAdditionalInfoPages <- c("Additional Information: page 20", # one space
                            "Additional Information:  page 7", # two spaces
                            "Additional Information:\tpage 50", # tab
                            "Additional Information:\npage 60") # newline

# Print vector to observe true formatting
cat(AnyAdditionalInfoPages)

# Output:
Additional Information: page 20
Additional Information:  page 7
Additional Information:       page 50
Additional Information:
page 60


# Negative lookahead for spaces *only*
variablename <- grep("Additional Information:(?! )", AnyAdditionalInfoPages,   
                     perl = TRUE, value = TRUE)
# Output
[1] "Additional Information:\tpage 50"  "Additional Information:\npage 60"

# Negative lookahead for *any* whitespace
variablename <- grep("Additional Information:(?!\\s)", AnyAdditionalInfoPages,   
                     perl = TRUE, value = TRUE)
# Output
character(0)

【讨论】:

  • Marcus 为奇怪的星号道歉。我试图加粗我的第一个和我的第二个/第三个之间的差异。然后有人建议进行编辑,他们以实际文本而不是格式出现。现在这一切都过去了。我唯一能说的和你的不同的是变量声明开头的'c('。这是做什么用的?它很重要吗?
  • 啊,我明白了,你的问题现在更有意义了。您是否尝试过再次运行您的代码?我刚刚尝试过,使用\\s 效果很好。
  • 另外,c() 代表 concatenate。它只是一个构造向量的函数调用,虽然它也可以结合一些其他的东西;见stackoverflow.com/questions/11488820/why-use-c-to-define-vector
  • 查看我的更新答案。
  • 太酷了。 c() 似乎是一个巧妙的技巧。我必须记住这一点。
猜你喜欢
  • 2014-02-25
  • 2018-04-04
  • 2015-09-21
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2017-02-21
  • 2018-12-23
  • 1970-01-01
相关资源
最近更新 更多