假设我有字符串NYKMIANYKCLE
,我想将其拆分为仅包含NYKMIA
和NYKCLE
的列表(在第二次出现'NYK'
之前拆分)。有没有办法在python中做到这一点?
答案 0 :(得分:1)
您可以使用re.findall
查找以NYK
开头的所有子字符串,不包含其他NYK
或后跟字符串结尾字符:
>>> s = 'NYKMIANYKCLE'
>>> import re
>>> re.findall(r'NYK.+?(?=NYK|$)', s)
['NYKMIA', 'NYKCLE']
第一个?
确保搜索非贪婪;一次一个子字符串,而(?=NYK|$)
强制断言子字符串在下一个NYK...
子字符串或字符串结尾字符$
之前。
更多测试:
>>> s = 'NYKMIANYKCLENYKjahsja'
>>> re.findall(r'NYK.+?(?=NYK|$)', s)
['NYKMIA', 'NYKCLE', 'NYKjahsja']
答案 1 :(得分:0)
您可以尝试这样的事情:
string = 'NYKMIANYKCLE'
substring = 'NYK'
first_index = string.index(substring)
second_index = string.index(substring, first_index + len(substring))
print string[:second_index], string[second_index:]
答案 2 :(得分:0)
由于问题是关于拆分,可以使用新的regex module来完成, 允许使用零宽度字符进行拆分
import regex
s='NYKMIANYKCLE'
print(regex.split('(?V1)(?=NYK)',s))
<强>输出强>
['', 'NYKMIA', 'NYKCLE']
<强>更新强>
避免在行的开头分割
print(regex.split('(?V1)[^^](?=NYK)',s))
<强>输出强>
['NYKMI', 'NYKCLE']
<强>解释强>
(?V1) #Forces new version 2 of split which allows zero width chars for split
[^^] #don't take line beginning as split
(?=NYK) #take a position as split if the position is followed by NYK
答案 3 :(得分:-1)
import re
re.findall("NYK[A-Z]+", "NYKMIANYKCLE")
来自文档:
findall(pattern,string,flags = 0)
返回字符串中pattern的所有非重叠匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包含空匹配,除非它们触及另一场比赛的开头。