【问题标题】:R: split only when special regex condition doesn't matchR:仅当特殊的正则表达式条件不匹配时才拆分
【发布时间】:2013-09-10 13:06:49
【问题描述】:

只有当and/ERT没有被“/V”在一个单词之后

中时,你将如何拆分它
text <- c("faulty and/ERT something/VBN and/ERT else/VHGB and/ERT as/VVFIN and/ERT not else/VHGB propositions one and/ERT two/CDF and/ERT three/ABC")

# my try - !doesn't work
> strsplit(text, "(?<=and/ERT)\\s(?!./V.)", perl=TRUE)
                                    ^^^^

# Exptected return
[[1]]    
[1] "faulty and/ERT something/VBN and/ERT else/VHGB and/ERT as/VVFIN and/ERT"
[2] "not else/VHGB propositions one and/ERT"
[3] "two/CDF and/ERT"            
[4] "three/ABC"    

【问题讨论】:

  • 如果它直接在可能的匹配之后,您是否希望它失败。即:and/ERT something/VBN 应该失败,and/ERT something something/VBN 不应该失败?引用@smerny。
  • Alex,您的最新编辑(str 和 return)仍然与我的正则表达式匹配:regexr.com?369f3

标签: regex r strsplit


【解决方案1】:

其实,你需要换一种方式来解决这个问题:

(?<=and/ERT)\\s(?!\\S+/V)
                  ^^^^

您需要使用\\S+,因为使用.* 会阻止匹配,即使/V 出现在前面两个单词。

\\S+ 顺便匹配非空格。

最后,可以放心地忽略最后一段。

regex101 demo

【讨论】:

    【解决方案2】:

    实际上你犯了一个小错误,但它导致一切都不起作用:

    (?<=and/ERT)\\s(?![^\\s/]+/V)
                      ^^^^^^^
                match one or more characters that are not white space or forward slash /
    

    顺便说一句,/V 后面的点. 不需要。

    编辑:我根据@smerny 的评论和您的编辑做了一些编辑。

    【讨论】:

    • 如果字符串后面有 /V 某些东西,这实际上是行不通的:regexr.com?369ek
    • 我的意思是它不起作用,因为.* 会一直查找到字符串的末尾,如果它在任何地方找到/V,它就不会匹配。 OP 似乎只希望它在可能的匹配之后直接失败。即:“and/ERT something/VBN”应该失败,“and/ERT something/VBN”不应该失败。
    • 惰性量词在这种情况下不会做任何事情,看看我在比较your current regexmy current regex时的意思,当字符串后面有一个/V时。
    • @smerny 对不起,我一开始误解了你,我会要求 OP 确保这是他真正想要的。谢谢。
    • 只是为了解释惰性量词,它处于负前瞻状态,所以它只是前瞻看看.*?/V 是否存在。如果.*/V 存在,.*?/V 也将存在,反之亦然。
    【解决方案3】:

    试试这个:

    (?<=and/ERT)\\s(?![a-zA-Z]+/V)
    

    问题是您的 /V 之前和之后是任何一个,并且您的示例在您的空间和您的 /V 之间有多个字符。

    [a-zA-Z]+/V 确保空格和 /V 之间的唯一内容是由字母组成的单个单词。根据您的描述和给出的示例,我相信这是您的要求。

    Demo

    【讨论】:

    • 不错的解决方案!非常感谢你!也适用于带有 Sniffer 的 cmets 中的重要点。我没有意识到这一点!顺便说一句:我在text 中添加了一个适当的情况。玩的开心! :)
    • @alex,是的,我看到您编辑了您的帖子,我对此进行了测试,它也可以按您的预期工作。见here(我想这就是你所指的)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2013-02-24
    • 2011-10-25
    相关资源
    最近更新 更多