按多个分隔符拆分并保留分隔符

时间:2018-08-17 10:05:21

标签: python regex

我有以下字符串输入:

"11A4B"
"5S6B"

并需要以下输出:

["11A", "4B"]
["5S", "6B"]

例如,在分隔符A,B或S分开并保留分隔符之后。

我可以使用split中的re(在定界符模式上加上括号也会返回所使用的定界符):

re.split("([ABS])", "11A4B")
#['11', 'A', '4', 'B', '']

并且可以四处寻找所需的解决方案,但是我想知道是否有一个纯正则表达式解决方案?

4 个答案:

答案 0 :(得分:3)

改为使用re.findall,并匹配数字后跟ABS

re.findall(r'\d+[ABS]', '11A4B')

输出:

['11A', '4B']

如果输入中可能还包含其他字母字符,请改用否定字符集:

re.findall(r'[^ABS]+[ABS]', 'ZZZAYYYSXXXB')

输出:

['ZZZA', 'YYYS', 'XXXB']

答案 1 :(得分:3)

一种适用于所有Python版本的解决方案将是基于PyPi regex模块的解决方案,该模块带有regex.splitregex.V1标志:

import regex
ss = ["11A4B","5S6B"]
delimiters = "ABS"
for s in ss:
    print(regex.split(r'(?<=[{}])(?!$)'.format(regex.escape(delimiters)), s, flags=regex.V1))

Output

['11A', '4B']
['5S', '6B']

详细信息

  • (?<=[ABS])-与后面紧跟ABS
  • 的位置相匹配的正向查找
  • (?!$)-不会立即跟在字符串末尾(因此,字符串末尾的所有位置都会失败)。

使用regex.escape是为了防止定界符列表中有特殊的正则表达式字符,例如^\-]

Python 3.7, re.split中,也可以使用零长度的匹配项进行拆分,因此,以下内容也将起作用:

re.split(r'(?<=[{}])(?!$)'.format(re.escape(delimiters)), s)

否则,您可能会使用变通方法,例如

re.findall(r'[^ABS]*[ABS]?', s) # May result in empty items, too
re.findall(r'(?s)(?=.)[^ABS]*[ABS]?', s) # no empty items due to the lookahead requiring at least 1 char

请参见regex demo

详细信息

  • (?s)-.也匹配换行符
  • (?=.)-一个字符应立即显示在当前位置的右侧
  • [^ABS]*-除ABS以外的0个以上的字符
  • [ABS]?-1或0(=可选)ABS字符。

答案 2 :(得分:2)

您可以使用环顾四周:

(?<=[ABS])(?!$)

Se a demo on regex101.com

答案 3 :(得分:1)

使用findall

re.findall('(.*?(?:[ABS]|.$))', "11A4B5")