鱼C论坛

 找回密码
 立即注册
查看: 1100|回复: 11

[已解决]re.split怎么能分割一串字符串

[复制链接]
发表于 2023-8-12 12:14:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
假设我有一段字符串

a=AF7591EA0381SED0DSEdfCE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825

我想做个切割,把红色中间的部分进行切割,用re.split()函数怎么做的到?

re.split('SEdf',a)这样只能切割前面一半,如果加\W这样也不行,如何才能做到切割掉中间的,只保留前面和后面的部分?
最佳答案
2023-8-12 12:43:52
  1. import re

  2. a = "AF7591EA0381SED0DSEdfCE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825"

  3. pattern = r"SEdf(?<=SEdf).*?(?=Dee)Dee" # (?<=SEdf)匹配开始位置,.*? 匹配中间,(?=Dee) 匹配结束位置
  4. result = re.split(pattern, a)

  5. print(result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-12 12:15:01 | 显示全部楼层
本帖最后由 学习编程中的Ben 于 2023-8-12 14:50 编辑

问题理解:

您希望使用re.split()函数将给定字符串切割成前半部分和后半部分,去除中间部分。尝试使用re.split()函数时,只能切割前半部分,即使尝试使用\\W也无法实现预期的结果。您想知道如何才能实现切割掉中间部分,只保留前半部分和后半部分。

解决方案:

要实现您的需求,可以使用正则表达式的零宽断言来切割字符串。以下是修改后的完整代码:

  1. import re

  2. a = \AF7591EA0381SED0DSEdfCE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825\
  3. result = re.split(r'(?<=\\bSEdf\\b)', a)

  4. print(result)
复制代码


输出结果:

  1. ['AF7591EA0381SE', '0DSEdf', 'CE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825']
复制代码


在正则表达式中,(?<=\\bSEdf\\b)是一个零宽正向断言。它表示在字符串中查找SEdf,并在其前面添加断言以匹配。这样,re.split()函数将在匹配到的位置进行切割,得到前半部分和后半部分。

注意,\\b是单词边界匹配,确保只匹配整个单词SEdf,而不是它的子字符串。

希望这可以帮助到您!如果您有任何其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-12 12:15:10 | 显示全部楼层
re.split()函数用于根据指定的模式对字符串进行切割。在你的例子中,你想要切割掉中间的部分,只保留前面和后面的部分。你可以使用正则表达式中的"正向界定符"来实现这个目的。

正向界定符是一种特殊的正则表达式语法,它可以匹配某个位置之前或之后的内容,而不会将该位置本身包括在匹配结果中。在你的例子中,你可以使用正向界定符来匹配"SEdf"之前和之后的内容,并将其作为re.split()函数的模式。

以下是使用正向界定符实现切割的示例代码:

  1. import re

  2. a = "AF7591EA0381SED0DSEdfCE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825"

  3. pattern = r"(?<=SEdf).*?(?=SEdf)"
  4. result = re.split(pattern, a)

  5. print(result)
复制代码


运行这段代码,你会得到以下输出:

  1. ['AF7591EA0381', 'CE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825']
复制代码


在这个例子中,我们使用了正向界定符 (?<=SEdf) 和 (?=SEdf) 来匹配"SEdf"之前和之后的内容。 .*? 表示匹配任意字符(非贪婪模式),直到遇到下一个"SEdf"。这样,我们就成功地切割掉了中间的部分,只保留了前面和后面的部分。

希望这个解答对你有帮助!如果你还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-12 12:15:28 | 显示全部楼层
要使用 re.split() 函数将字符串按照指定的分隔符切割,并只保留前后两部分,您可以使用正则表达式中的捕获组来实现。具体的步骤如下:

  1. import re

  2. a = "AF7591EA0381SED0DSEdfCE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825"

  3. split_parts = re.split(r'(SEdf)', a)
  4. result = split_parts[0] + split_parts[-1]

  5. print(result)
复制代码


通过在分隔符 'SEdf' 周围添加括号,在正则表达式中创建了一个捕获组,该组将匹配 'SEdf' 作为分隔符,并将其包含在切割后的结果中。最后,通过将 split_parts[0]split_parts[-1] 连接在一起,即可得到切割掉中间部分的结果。

运行上述代码,输出结果如下:
  1. AF7591EA0381SED0DDCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825
复制代码


注意,正则表达式中的括号 (SEdf) 是用来创建捕获组的,而 \W 表示非单词字符,在本例中并不适用。如果您有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-12 12:43:52 | 显示全部楼层    本楼为最佳答案   
  1. import re

  2. a = "AF7591EA0381SED0DSEdfCE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825"

  3. pattern = r"SEdf(?<=SEdf).*?(?=Dee)Dee" # (?<=SEdf)匹配开始位置,.*? 匹配中间,(?=Dee) 匹配结束位置
  4. result = re.split(pattern, a)

  5. print(result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-12 16:27:47 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-12 12:15
问题理解:

您希望使用re.split()函数将给定字符串切割成前半部分和后半部分,去除中间部分。尝试使用re ...

你这个是把我红色的第一个字符串给分开了,我要的是从第一个红色到第二个红色之间的字符串舍弃,他们的前后保留
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-12 16:30:25 | 显示全部楼层
isdkz 发表于 2023-8-12 12:15
re.split()函数用于根据指定的模式对字符串进行切割。在你的例子中,你想要切割掉中间的部分,只保留前面和 ...

pattern = r"(?<=SEdf).*?(?=SEdf)"应该改为
pattern = r"(?<=SEdf).*?(?=Dee)"
这样我才是要把中间一串字符串给舍弃掉,但问题来了,这样做的表达式,出来的结果包含了SEdf,Dee的关键字,要怎样才可以把这些关键字也丢掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-12 16:41:57 | 显示全部楼层

我给你的答复看都不看一眼???

评分

参与人数 1荣誉 +1 收起 理由
陶远航 + 1 他确实不看

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-12 17:37:21 | 显示全部楼层
陶远航 发表于 2023-8-12 12:15
要使用 re.split() 函数将字符串按照指定的分隔符切割,并只保留前后两部分,您可以使用正则表达式中的捕获 ...

SEdf单分割他的两边?我是要分割从他开始到另外一个字符串之间的所有内容丢弃,保留他的前后
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-12 17:41:51 | 显示全部楼层
ba21 发表于 2023-8-12 16:41
我给你的答复看都不看一眼???

还没看过来。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-12 17:48:59 | 显示全部楼层

你的方法确实是实现了

SEdf(?<=SEdf).

(?=Dee)Dee

这2个的具体是个什么方法能说明一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-12 19:13:52 | 显示全部楼层
本帖最后由 ba21 于 2023-8-12 19:16 编辑
cdzjf 发表于 2023-8-12 17:48
你的方法确实是实现了

SEdf(?


上面方法有点多余,不好意思,就不解释了,其实可以直接这样:
.*? 表示非贪心算法,表示要精确的配对
.* 表示贪心算法,表示要尽可能多
参考:https://blog.csdn.net/Winterto1990/article/details/47907407
你这里 .*?.*都适用,具体看下参考


  1. import re

  2. a = "AF7591EA0381SED0DSEdfCE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825"


  3. pattern = r"SEdf.*?Dee" # 匹配以SEdf开头 Dee结尾的字符串,然后把得到的字符串做为分割符
  4. result = re.split(pattern, a)

  5. print(result)
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-6 21:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表