首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么strsplit使用正的前瞻性和查找后断言的匹配方式不同?

为什么strsplit使用正的前瞻性和查找后断言的匹配方式不同?
EN

Stack Overflow用户
提问于 2013-03-22 08:23:25
回答 3查看 1.9K关注 0票数 27

常识和使用gregexpr()进行的理智检查表明,下面的前瞻性和前瞻性断言应该在testString中的一个位置匹配。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
testString <- "text XX text"
BB  <- "(?<= XX )"
FF  <- "(?= XX )"

as.vector(gregexpr(BB, testString, perl=TRUE)[[1]])
# [1] 9
as.vector(gregexpr(FF, testString, perl=TRUE)[[1]][1])
# [1] 5

然而,strsplit()以不同的方式使用这些匹配位置,在使用查找后断言时,在one位置拆分testString,而在使用前瞻性断言时在的两个位置--第二个位置似乎不正确--进行拆分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
strsplit(testString, BB, perl=TRUE)
# [[1]]
# [1] "text XX " "text"    

strsplit(testString, FF, perl=TRUE)
# [[1]]
# [1] "text"    " "       "XX text"

我有两个问题:(Q1),这是怎么回事?(Q2)如何才能让strsplit()表现得更好呢?

更新: Theodore Lytras的出色回答解释了正在发生的事情,因此提到了(Q1)。我的答案建立在他的基础上,找到了一种补救办法,即寻址(Q2)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-22 12:05:06

我不确定这是否符合错误,因为我认为这是基于R文档的预期行为。来自?strsplit

应用于每个输入字符串的算法是 重复{如果字符串为空中断。如果有匹配,则将匹配的左侧字符串添加到输出中。移除火柴和所有左边的火柴。否则,将字符串添加到输出中。休息一下。} 请注意,这意味着如果在(非空)字符串的开头有匹配,则输出的第一个元素为“”,但如果字符串末尾有匹配,则输出与删除的匹配相同。

问题是,前瞻性(和回顾性)断言是零长度的。例如,在本例中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FF <- "(?=funky)"
testString <- "take me to funky town"

gregexpr(FF,testString,perl=TRUE)
# [[1]]
# [1] 12
# attr(,"match.length")
# [1] 0
# attr(,"useBytes")
# [1] TRUE

strsplit(testString,FF,perl=TRUE)
# [[1]]
# [1] "take me to " "f"           "unky town" 

所发生的情况是,孤独的展望(?=funky)匹配位置12。因此,第一个拆分包含到位置11 (匹配的左边)的字符串,它与匹配一起从字符串中移除,但是匹配的长度为零。

现在剩下的字符串是funky town,查找位置1匹配。但是没有什么要删除的,因为在匹配的左边没有任何内容,而且匹配本身的长度为零。因此,算法被困在一个无限循环中。显然,R是通过拆分单个字符来解决这一问题的,顺便说一句,这是strsplit使用空正则表达式(当参数为split="")时的记录行为。在此之后,剩下的字符串是unky town,由于没有匹配,它作为最后一个拆分返回。

查找后向没有问题,因为每个匹配被分割并从剩余的字符串中删除,所以算法永远不会被卡住。

诚然,乍一看,这种行为看起来很奇怪。然而,如果不这样做,就违反了看台长度为零的假设。考虑到strsplit算法是文档化的,我相信这不符合bug的定义。

票数 29
EN

Stack Overflow用户

发布于 2013-03-22 14:17:02

基于Theodore Lytras对substr()行为的仔细解释,一个相当干净的解决方法是在即将匹配的前瞻性断言前加上一个与任何单个字符匹配的正向后断言:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
testString <- "take me to funky town"
FF2 <- "(?<=.)(?=funky)"
strsplit(testString, FF2, perl=TRUE)
# [[1]]
# [1] "take me to " "funky town" 
票数 17
EN

Stack Overflow用户

发布于 2013-03-22 09:36:49

在我看来是个虫子。这似乎不只是与空间有关,特别是,而是任何孤独的展望(积极或消极):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FF <- "(?=funky)"
testString <- "take me to funky town"
strsplit(testString,FF,perl=TRUE)
# [[1]]
# [1] "take me to " "f"           "unky town"  

FF <- "(?=funky)"
testString <- "funky take me to funky funky town"
strsplit(testString,FF,perl=TRUE)
# [[1]]
# [1] "f"                "unky take me to " "f"                "unky "           
# [5] "f"                "unky town"       


FF <- "(?!y)"
testString <- "xxxyxxxxxxx"
strsplit(testString,FF,perl=TRUE)
# [[1]]
# [1] "xxx"       "y"       "xxxxxxx"

如果提供了一些可以与零宽度断言一起捕获的内容,则似乎工作得很好,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FF <- " (?=XX )"
testString <- "text XX text"
strsplit(testString,FF,perl=TRUE)
# [[1]]
# [1] "text"    "XX text"

FF <- "(?= XX ) "
testString <- "text XX text"
strsplit(testString,FF,perl=TRUE)
# [[1]]
# [1] "text"    "XX text"

也许像这样的东西可以作为一个解决办法。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15575221

复制
相关文章
SpringBoot正匹配和负匹配
在Spring框架的自动配置中,”Positive matches”(正匹配)和”Negative matches”(负匹配)是用于条件化配置的概念。
酒楼
2023/06/20
8300
[Go]空接口类型断言后 .(指针类型) 和.(具体对象) 的不同区别
拿到以后我们还需要类型断言把类型转换回原始类型 ,空接口可以存储指针变量 , 也可以存储具体类型
唯一Chat
2021/05/10
2K0
[Go]空接口类型断言后 .(指针类型) 和.(具体对象) 的不同区别
网络工程师进阶 | QoS使用不同的方式匹配数据
Access-list 100 permit tcp any any lt 1024/lt 1024 表示小于1024的端口
网络技术联盟站
2019/07/23
1.3K0
恼人的部分匹配查找
这天有空,小范照常开始了Excel的研习。俗话说,一天不练,手生脚慢;两天不练,功夫减半;三天不练,成了门外汉。对于自己热爱的Excel,小范从不马虎。
fanjy
2021/10/15
1.9K0
pytest学习和使用19-pytes断言失败后,怎样保持后续的断言继续执行?(pytest-assume)
1 引入pytest使用assert进行断言,如果有多个断言,第一个失败了,那么后续的断言将不会执行;那么如果第一个断言失败了,还想继续保持执行后边的断言,那如何做?我们可以使用pytest-assume来解决这个问题,即使用多重断言插件。2 pytest-assume安装pip3 install pytest-assumeC:\Users\Administrator>pip3 install pytest-assumeLooking in indexes: https://pypi.tuna.tsingh
虫无涯
2023/03/17
9850
JavaScript:查找/匹配
charAt() 返回在指定位置的字符。 示例:'abc'.charAt(1); //"b" charCodeAt() 返回在指定的位置的字符的 Unicode 编码。 示例:'abc'.charCodeAt(1); //98 indexOf(searchvalue,fromindex) 检索字符串,返回对应下标。 示例:'abcabc'.indexOf('b',0); //1 'abcabc'.indexOf('b',2); //4 search(regexp) 检索与正则表达式相匹配的值,返回对应下标。 示例:'abcabc'.search('b'); //1 'abcabc'.search(/b/img); //1 match(regexp) 找到一个或多个正则表达式的匹配,没有返回null,否则返回数组 示例:'abcabc'.match('b'); //["b"] 'abcabc'.match(/b/img); //["b", "b"] PS:上述regexp,可以是子串、也可以是正则。
奋飛
2019/08/15
4970
--MYSQL MGR 崩溃后的修复和问题查找
MYSQL 的 GROUP REPLICATION 估计大多数的公司都没有用,即使用也不是在主要的项目和关键的地方。所以网上相关MYSQL Group Replicaiton 的的修复的东西也不多。赶巧,最近我们的测试系统的 MGR 崩溃了。
AustinDatabases
2019/09/10
2.8K0
--MYSQL  MGR 崩溃后的修复和问题查找
使用Zuthaka管理不同APT和其他后渗透工具
Zuthaka是一款开源的应用程序,旨在帮助红队研究人员完成安全分析与管理任务。Zuthaka可以简化很多操作任务,比如说针对不同APT和其他后渗透工具的管理等等。 除此之外,Zuthaka还是一个免费的开源协作C&C整合框架,可以允许广大开发人员专注于其命令控制服务器的核心功能和目标。 当前的C2生态系统正在迅速发展,以适应现代红队作战和多样化需求。这也给安全专业人员带来了很大的额外工作量以及开销。创建C2系统已经是一项艰巨的任务了,而且大多数可用的C2系统系统都缺乏直观且易于使用的Web界面。 因此,Z
FB客服
2023/03/30
2500
使用Zuthaka管理不同APT和其他后渗透工具
Cypress测试断言的使用
断言是测用例的必要组成部分,Cypress支持多种断言,其中包括BDD(expect/should)和TDD(assert)格式断言。
wencheng
2021/01/05
1.8K0
Cypress测试断言的使用
Java和Python思维方式的不同之处
我刚刚开始工作的时候,其实特别讨厌Java。因为它太繁琐,就像一个絮絮叨叨的老奶奶。但后来因为工作原因强行写了一年的Java,反而不那么讨厌它了。
青南
2021/11/19
7400
讲解不同的上网方式,ADSL和光纤入户
ADSL接入网是一种常用的宽带接入技术,用于连接家庭或公司网络与互联网。下面将详细介绍ADSL接入网的结构和工作方式。
一凡sir
2023/08/27
5770
讲解不同的上网方式,ADSL和光纤入户
如何使用Zuthaka管理不同APT和其他后渗透工具
 关于Zuthaka  Zuthaka是一款开源的应用程序,旨在帮助红队研究人员完成安全分析与管理任务。Zuthaka可以简化很多操作任务,比如说针对不同APT和其他后渗透工具的管理等等。 除此之外,Zuthaka还是一个免费的开源协作C&C整合框架,可以允许广大开发人员专注于其命令控制服务器的核心功能和目标。 当前的C2生态系统正在迅速发展,以适应现代红队作战和多样化需求。这也给安全专业人员带来了很大的额外工作量以及开销。创建C2系统已经是一项艰巨的任务了,而且大多数可用的C2系统系统都缺乏直观且易于使用
FB客服
2023/03/30
3030
如何使用Zuthaka管理不同APT和其他后渗透工具
pytest学习和使用5-Pytest和Unittest中的断言如何使用?
1 说明pytest中使用assert进行断言,和unittest是有区别的,后边详细列举;pytest中的assert后可以为表达式,为True表示用例通过。2 Uinttest中的断言2.1 部分断言我们写一个class,代码中就可以看到所有的断言:图片常用断言:图片2.2 部分举例# -*- coding:utf-8 -*-# 作者:NoamaNelson# 日期:2021/11/26 # 文件名称:test_unint.py# 作用:unittest断言# 联系:VX(NoamaNelson)# 博
虫无涯
2023/02/08
7530
【Groovy】集合遍历 ( 使用集合的 find 方法查找集合元素 | 闭包中使用 == 作为查找匹配条件 | 闭包中使用 is 作为查找匹配条件 | 闭包使用 true 作为条件 | 代码示例 )
集合的 find 方法返回值 , 返回符合闭包中的匹配条件的第一个元素的值 , 即使后面还有符合条件的元素 , 也不再进行遍历了 ;
韩曙亮
2023/03/30
1.7K0
【Groovy】集合遍历 ( 使用集合的 find 方法查找集合元素 | 闭包中使用 == 作为查找匹配条件 | 闭包中使用 is 作为查找匹配条件 | 闭包使用 true 作为条件 | 代码示例 )
Pytest学习(二) - 断言的使用
学习pytest时,总会习惯性的和unittest对比使用,自然就断言pytest和unittest也是有些区别的。
软件测试君
2020/10/29
4950
Pytest学习(二) - 断言的使用
正则表达式零宽断言详解(?=,?<=,?!,?<!)
在使用正则表达式时,有时我们需要捕获的内容前后必须是特定内容,但又不捕获这些特定内容的时候,零宽断言就起到作用了 正则表达式零宽断言: 零宽断言是正则表达式中的难点,所以重点从匹配原理方面进行分析。零宽断言还有其他的名称,例如"环视"或者"预搜索"等等,不过这些都不是我们关注的重点。 我很强,我想直接看例子上手用 一.基本概念: 零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配结果只是一个位置而已。 作用是给指定位置添加一个限定条件,用来规定此位置之前或者之后的字
mcq
2018/06/20
6.9K0
CSS不同的样式声明方式
行内样式 行内样式表:直接将CSS代码写在标签中。 <p style=”属性:属性值;……”>内容</p> 内部样式 内部样式表: css代码写在<style>标签对中的样式表。 <style type=”css/text”> 选择器名{属性:属性值;} </style> 链接样式表 链接样式表:样式单独生成css文件,由<link/>引用。 <head> <link rel=”stylesheet” type=”text/css” href=”css文件名”/> </head> 导入样式
白胡杨同学
2020/04/10
1.2K0
使用TestNG中HardAssert和SoftAssert断言
第一步:发起请求 第二步:断言响应状态是否200,如果成功继续 第三步:断言响应时间是否符合标准(非必须) 第四步:断言响应数据是否正确,一般的做法是判断某个值是否相等或者包含关系。
桑鱼
2020/04/23
1.2K0
点击加载更多

相似问题

使用Perl前瞻性断言查找单个列表。

110

可选地使用查找后断言匹配符号

10

Regex前瞻性和后视匹配

21

Regex断言只在前瞻性和后置方式中工作。

10

regex前瞻性断言

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文