处理正则表达式中的方括号

Posted

技术标签:

【中文标题】处理正则表达式中的方括号【英文标题】:Dealing with square brackets in regex 【发布时间】:2022-01-22 07:19:27 【问题描述】:

我有一些数据,如下所示:

df <-
  data.frame(
    'col' = c(
      'some words [remove this] more words',
      'some other words [I want this gone] this is fine',
      '[nope.  get rid of it] but keep this',
      'all of this is fine',
      '[but] this [should] go [away]')
    )

                                               col
1              some words [remove this] more words
2 some other words [I want this gone] this is fine
3              [nope  get rid of it] but keep this
4                              all of this is fine
5                    [but] this [should] go [away]

我想删除所有方括号以及它们之间的所有内容。

goal_df <- df <-
  data.frame(
    'col' = c(
      'some words more words',
      'some other words this is fine',
      'but keep this',
      'all of this is fine',
      'this go')
  )

                            col
1         some words more words
2 some other words this is fine
3                 but keep this
4           all of this is fine
5                       this go

我认为使用正则表达式(这是我最差的编程技能)会是解决方案,但我似乎无法让它发挥作用。我正在使用df$col &lt;- gsub( "[.*?]", "", df$col),但这并没有做任何改变。

【问题讨论】:

【参考方案1】:

我们可能会匹配[,后跟一个或多个不是] 的字符,然后是] 和任何空格作为模式,并在gsub 中替换为空格("")。 [] 是元字符,因此请转义 (\\)

df$col <- trimws(gsub("\\[[^]]+\\]\\s?", "", df$col))

-输出

> df
                            col
1         some words more words
2 some other words this is fine
3                 but keep this
4           all of this is fine
5                       this go

【讨论】:

谢谢!你能解释一下s是什么吗?到底呢?我的正则表达式很糟糕,所以如果这是一个愚蠢的问题,我很抱歉。 @pkpto39 如果我使用\\s,它将与最后一个不匹配,因为在] 之后没有空格。您可以使用\\s*。 - 零个或多个空格或进行零个或多个匹配的? trimws 是个好主意,如果我是你,我会充分利用它(M$ 繁体),在模式的每一侧添加所有最终的空格,以“规范化”它们在单个空间中:trimws(gsub("\\s*\\[[^]]+\\]\\s*", " ", df$col))【参考方案2】:

一个更容易解析的解决方案是使用*? 制作的非贪婪的量词:

gsub("\\s?\\[.*?\\]+", "", df$col)
[1] "some words more words"         "some other words this is fine" " but keep this"               
[4] "all of this is fine"           " this go"

要删除前导或尾随空格,请使用trimws

【讨论】:

以上是关于处理正则表达式中的方括号的主要内容,如果未能解决你的问题,请参考以下文章

C#常用正则表达式回顾

如何用正则表达式匹配括号中的内容,不包含括号

正则表达式如何匹配提取括号中的内容

如何用正则表达式匹配括号中的内容。

c#用正则表达式提取小括号中的内容

如何使用正则表达式删除括号内的文本?