【问题标题】:Remove spaces between line breaks only仅删除换行符之间的空格
【发布时间】:2023-03-15 10:17:01
【问题描述】:

我有以下示例字符串,其中包含换行符“\n”和空格“”:

a <- "\n \n \n \nTEST TEST\n"

我想删除换行符 ("\n") 之后的空格 (" "),但不删除其他字符串之后的空格(例如我的玩具示例中的 "TEST")。因此,我想要的输出是:

"\n\n\n\nTEST TEST\n"

我尝试了 stringr 的 str_remove_allstr_replace_all 但没有成功,因为在这种情况下,这些似乎有问题,因为换行符的相邻出现。这是我得到的最接近的:

str_replace_all(a, "\n[ ]*\n", "\n\n")

我在这个(可能非常简单)问题上花了几个小时,因此非常感谢任何帮助!

【问题讨论】:

  • 目前尚不清楚在" \n \n \n \n TEST TEST\nTest1 Test2 \n " 的情况下您想得到什么如果您需要一个可靠解决方案的明确答案,请分享您当前的代码。 “我花了几个小时在这上面” - 什么不起作用?你能分享你使用的正则表达式吗?请注意,您说“仅删除换行符之间的空格”,但TEST TEST 中的空格也在两个\ns 之间,并且您希望它保留。请澄清您的问题。
  • 感谢 Wiktor 的提示,我认为这很清楚,因为我写了“中间”换行符(不包括“之前”和“之后”换行符)。然而,如果前导和尾随空格也被删除,这不是一个大问题。我最接近尝试这个:str_replace_all(a, "\n[ ]*\n", "\n\n"),但这只会删除不重叠的事件。与此同时,LC-datascientist 解决了我的问题。
  • 我以为您只想从空行中删除空格(空格和制表符)。请使用您的实际尝试和实际问题描述来编辑问题。

标签: r regex line-breaks stringr


【解决方案1】:
gsub("\n *", "\n", a)

str_replace_all(a, "\n *", "\n") # with stringr package

将为您提供所需的输出"\n\n\n\nTEST TEST\n"

编辑:仅用于空白行之间的空格

请注意,上述内容也会删除出现在非空行开头的空格——例如,如果字符串是 "\n TEST TEST \n"

@bobble bubble 建议将(?=\n) 包含在搜索模式中(即"\n *(?=\n)")适用于空行之间。 (谢谢bobble bubble

gsub("\n *(?=\n)", "\n", a, perl=TRUE)

str_replace_all(a, "\n *(?=\n)", "\n") # with stringr package

(?=(regex))positive lookahead assertion。作为"\n *(?=\n)",这意味着断言的正则表达式\n需要直接出现在\n *之后(带有空格的新行),但它不会在字符串模式中被捕获.因为断言的正则表达式未在模式中捕获,所以在使用 gsubstringr::str_replace_all 时不会被替换。

为了更清楚地说明这一点,以下示例中仅替换了出现在“bu”之前的“b”:

str_replace_all("bobblebbubble", "b(?=bu)", "_")
#[1] "bobble_bubble"

【讨论】:

  • 请注意,在这种情况下,您还会从非空行的开头删除文字空格。
  • 我想知道如果空格应该在换行符之间,您是否可以使用gsub("\n *(?=\n)", "\n", a, perl=TRUE)。好吧,我不喜欢 R,只是一个想法。
【解决方案2】:

我相信您可以删除任何包含水平空格的行。使用stringr,您可以使用

library(stringr)
a <- "\n \n   \n \nTEST TEST\n"
stringr::str_replace_all(a, "(?m)^\\h+$", "")

请参阅 R demoregex demo详情

  • (?m) - 一个多行修饰符,使 ^ 匹配任何行的开头,$ 匹配任何行的结尾位置
  • ^ - 行开始
  • \h+ - 一个或多个水平空白字符
  • $ - 行尾。

【讨论】:

    猜你喜欢
    • 2014-07-20
    • 2013-12-08
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    相关资源
    最近更新 更多