cdzjf 发表于 2023-8-12 12:14:52

re.split怎么能分割一串字符串

假设我有一段字符串

a=AF7591EA0381SED0DSEdfCE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825

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

re.split('SEdf',a)这样只能切割前面一半,如果加\W这样也不行,如何才能做到切割掉中间的,只保留前面和后面的部分?

学习编程中的Ben 发表于 2023-8-12 12:15:01

本帖最后由 学习编程中的Ben 于 2023-8-12 14:50 编辑

问题理解:

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

解决方案:

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

import re

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

print(result)


输出结果:

['AF7591EA0381SE', '0DSEdf', 'CE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825']

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

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

希望这可以帮助到您!如果您有任何其他问题,请随时提问。

isdkz 发表于 2023-8-12 12:15:10

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

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

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

import re

a = "AF7591EA0381SED0DSEdfCE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825"

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

print(result)


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

['AF7591EA0381', 'CE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825']


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

希望这个解答对你有帮助!如果你还有其他问题,请随时提问。

陶远航 发表于 2023-8-12 12:15:28

要使用 re.split() 函数将字符串按照指定的分隔符切割,并只保留前后两部分,您可以使用正则表达式中的捕获组来实现。具体的步骤如下:

import re

a = "AF7591EA0381SED0DSEdfCE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825"

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

print(result)


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

运行上述代码,输出结果如下:
AF7591EA0381SED0DDCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825


注意,正则表达式中的括号 (SEdf) 是用来创建捕获组的,而 \W 表示非单词字符,在本例中并不适用。如果您有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案

ba21 发表于 2023-8-12 12:43:52

import re

a = "AF7591EA0381SED0DSEdfCE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825"

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

print(result)

cdzjf 发表于 2023-8-12 16:27:47

学习编程中的Ben 发表于 2023-8-12 12:15
问题理解:

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

你这个是把我红色的第一个字符串给分开了,我要的是从第一个红色到第二个红色之间的字符串舍弃,他们的前后保留

cdzjf 发表于 2023-8-12 16:30:25

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

pattern = r"(?<=SEdf).*?(?=SEdf)"应该改为
pattern = r"(?<=SEdf).*?(?=Dee)"
这样我才是要把中间一串字符串给舍弃掉,但问题来了,这样做的表达式,出来的结果包含了SEdf,Dee的关键字,要怎样才可以把这些关键字也丢掉

ba21 发表于 2023-8-12 16:41:57

cdzjf 发表于 2023-8-12 16:30
pattern = r"(?

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

cdzjf 发表于 2023-8-12 17:37:21

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

SEdf单分割他的两边?我是要分割从他开始到另外一个字符串之间的所有内容丢弃,保留他的前后

cdzjf 发表于 2023-8-12 17:41:51

ba21 发表于 2023-8-12 16:41
我给你的答复看都不看一眼???

还没看过来。。。。

cdzjf 发表于 2023-8-12 17:48:59

ba21 发表于 2023-8-12 12:43


你的方法确实是实现了

SEdf(?<=SEdf).

(?=Dee)Dee

这2个的具体是个什么方法能说明一下吗

ba21 发表于 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
你这里 .*? 和 .*都适用,具体看下参考


import re

a = "AF7591EA0381SED0DSEdfCE6EA879EFB0185E0DCC9F78A7A11EA68E8F535E43650BD5E0DF1E07219340249477Dee8AF52A6113825"


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

print(result)



页: [1]
查看完整版本: re.split怎么能分割一串字符串