在Python中按模式分割字符串(而不是在开头或结尾)

时间:2019-05-02 16:44:31

标签: python regex split

在Python中同时出现连字符和数字时,我试图拆分字符串。

示例-

'ABC7-8-1234: Veggie - RESTRICTED (1)' -> ['ABC7','234: Veggie - RESTRICTED (1)']
'AB-WALT-9-2065: Application (6)` -> ['AB-WALT', '065: Application (6)']

作为第1步-我尝试了re.split()以“-”分隔。但它不起作用。


    name = re.split(r"\B-", string)

我得到['ABC7-8-1234: Veggie ', ' RESTRICTED (1)']而不是['ABC7','8','1234: Veggie ', ' RESTRICTED (1)']的输出。

第2步将检查连字符和数字的出现。就像-[0-9]

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

您可以先用:拆分字符串,并获取零索引,然后使用正则表达式-\d+-拆分该字符串,然后应该在问题中得到所需的值。查看此Python代码,

import re

arr = ['ABC7-8-1234: Veggie - RESTRICTED (1)', 'AB-WALT-9-2065: Application (6)']

for s in arr:
 print(re.split(r'-\d+-', re.split(':', s)[0]))

打印

['ABC7', '1234']
['AB-WALT', '2065']

作为一种替代方法,您还可以使用此正则表达式并从group1和group2捕获值,

^(.+?)-\d+-([^:]+)

Regex Demo

Python代码,

import re

arr = ['ABC7-8-1234: Veggie - RESTRICTED (1)', 'AB-WALT-9-2065: Application (6)']

for s in arr:
 m = re.search(r'^(.+?)-\d+-([^:]+)', s)
 if m:
  print([m.group(1), m.group(2)])

打印

['ABC7', '1234']
['AB-WALT', '2065']

答案 1 :(得分:0)

完整的答案:

st='ABC7-8-1234: Veggie - RESTRICTED (1)'
st=re.search('(.*):.*', st).group(1)
re.split('-\d-', st)

Out[26]: ['ABC7', '1234']

答案 2 :(得分:0)

使用正则表达式和非捕获组(?:):

s1='ABC7-8-1234: Veggie - RESTRICTED (1)' 
re.split(r"(?:-\d)+",s1)                                               
Out: ['ABC7', '234: Veggie - RESTRICTED (1)']

保留分隔符模式中的数字:

re.split(r"-(\d)",s1)                                                  
Out: ['ABC7', '8', '', '1', '234: Veggie - RESTRICTED (1)']

如果有连续的模式,则会得到空字符串。

使用积极的前瞻:

re.split(r"-(?=\d)",s1)                                                
Out: ['ABC7', '8', '1234: Veggie - RESTRICTED (1)']