【问题标题】:Capture only "\n" if inside a parenthesis如果在括号内,则仅捕获“\n”
【发布时间】:2021-03-30 01:56:30
【问题描述】:

我正在为分析进行一些文本处理,但遇到了一个问题,我只需要删除括号中的“\n”(直接后跟一个单词)。我认为一个例子可以说明我想要做什么:

“\nMr. Johnson (spoke in \nRussian) (United Kingdom and \nNortheren Ireland) \n” 

我需要 Johnson 先生之前的“\n”来完成另一项任务,因此我只对删除 \n 如果它在括号内感兴趣并保留其余文本,所以得到以下输出:

“\nMr. Johnson (spoke in Russian) (United Kingdom and Northeren Ireland) \n”

我的主要想法是制作某种正则表达式,可以在括号内捕获“\n”,并与 stringr 包中的 str_replace_all() 函数一起去掉它。 不过,我发现说起来容易做起来难,经过一些研究和时间,我想出了两种可能的方法,这两种方法都可以解决这个问题:

  1. 我想出了下面的正则表达式模式“(spoke in (\n).*?)”。 但是它会选择所有括号内的单词,而且它无法选择\n 没有出现在“spoke in”之后的情况...
  2. 创建条件正则表达式模式:使用以下来源获得灵感 https://www.youtube.com/watch?v=k4Be42-sf0shttps://www.regular-expressions.info/conditional.htmlRegular expression with if condition 我尝试创建以下模式:“(?(?=((.*?) ))\n)”,但它似乎不起作用......

因此,如果你们中的任何正则表达式爱好者可以帮助我解决这个问题,我会在这里? 我使用的是 R,因此使用的是 ICU 正则表达式引擎。

一切顺利 埃里克

【问题讨论】:

  • 你好维克托!非常感谢您的详细解答!!!所有最好的埃里克:-D

标签: r regex


【解决方案1】:

你可以使用

x <- "\nMr. Johnson (spoke in \nRussian) (United Kingdom and \nNortheren Ireland) \n"
library(stringr)
str_replace_all(x, "\\([^()]*\\)", function(z) gsub("\n", "", z, fixed=TRUE) )
# => [1] "\nMr. Johnson (spoke in Russian) (United Kingdom and Northeren Ireland) \n"

这里,\([^()]*\) 匹配 () 之间的子字符串,中间没有 ()function(z) gsub("\n", "", z, fixed=TRUE) 从每个非重叠匹配中删除所有换行符。

基本 R 方法也是可能的:

x <- "\nMr. Johnson (spoke in \nRussian) (United Kingdom and \nNortheren Ireland) \n"
gr <- gregexpr("\\([^()]*\\)", x)
mat <- regmatches(x, gr)
regmatches(x, gr) <- lapply(mat, function(z) sub("\n", "", z, fixed=TRUE))
x
# => [1] "\nMr. Johnson (spoke in Russian) (United Kingdom and Northeren Ireland) \n"

this R demo online

【讨论】:

    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 2013-06-17
    • 2021-12-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2013-10-31
    相关资源
    最近更新 更多