【问题标题】:Getting two substrings/groups before and after last nth "_"在最后一个“_”之前和之后获取两个子字符串/组
【发布时间】:2016-12-14 10:41:10
【问题描述】:

我们来看一个例子:

abc_def_ghi_jkl

如果我选择n = 1,我希望输出为:

group1 = abc_def_ghi
group2 = jkl

如果我选择n = 2,我希望输出为:

group1 = abc_def
group2 = ghi_jkl

注意:将两个组分开的_ 被删除。

现在我只知道如何选择最后一组,但它也选择了_

(?:.(?!(?=\_)))+$

注意 2:我目前专注于正则表达式部分,但它是用于 R 的代码,如果它有助于找到解决方案。

【问题讨论】:

  • 是否有使用正则表达式的特定原因?对我来说,在'_' 上使用strsplit,然后使用paste(..., collapse = '_') 似乎是解决这个特定示例的更简单的解决方案。
  • 如此简单... 3 小时,我以错误的方式看待问题。谢谢 !但是我仍然很想了解更多关于正则表达式的信息,所以如果有人有答案:)
  • 嗯,可以有一个基于正则表达式的答案来匹配组,比如^(.*?)_((?:_?[^_]+){3})$。替换{...} 中的数字以获取您需要的部件。只是当您使用超出范围的数字时,行为可能会变得很奇怪。
  • 感谢您的建议,我将永远不必得到一个与 _ 的号码不匹配的号码,因为我会一步一步地进行,直到第一组匹配某个值,但我'请记住这一点。

标签: regex r


【解决方案1】:

有可能在第 n 次出现 _ 时从字符串末尾拆分:

strsplit("abc_def_ghi_jkl", "_(?=([^_]*_){0}[^_]*$)", perl = T)
                                     #    ^
                                     #  you can modify the quantifier here
#[[1]]                                         
#[1] "abc_def_ghi" "jkl"                    # split on the 1st

strsplit("abc_def_ghi_jkl", "_(?=([^_]*_){1}[^_]*$)", perl = T)
#[[1]]
#[1] "abc_def" "ghi_jkl"                    # split on the 2nd

strsplit("abc_def_ghi_jkl", "_(?=([^_]*_){2}[^_]*$)", perl = T)
#[[1]]
#[1] "abc"         "def_ghi_jkl"            # split on the 3rd

_(?=([^_]*_){2}[^_]*$) 在模式([^_]*_){2}[^_]*$ 之前通过?= 前瞻语法查找_,该模式从字符串$ 的末尾开始并跳过任何非_ 模式[^_]* 并匹配([^_]*_) 出现一定次数,然后在指定的_ 上拆分。

更新来自stringr包的str_match

str_match("abc_def_ghi_jkl", "(.*)_((?:[^_]*_){0}[^_]*$)")[,2:3]
# [1] "abc_def_ghi" "jkl"     

str_match("abc_def_ghi_jkl", "(.*)_((?:[^_]*_){1}[^_]*$)")[,2:3]
# [1] "abc_def" "ghi_jkl"

str_match("abc_def_ghi_jkl", "(.*)_((?:[^_]*_){2}[^_]*$)")[,2:3]
# [1] "abc"         "def_ghi_jkl"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2021-09-18
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多