我有以下字符串输入:
"11A4B"
"5S6B"
并需要以下输出:
["11A", "4B"]
["5S", "6B"]
例如,在分隔符A,B或S分开并保留分隔符之后。
我可以使用split
中的re
(在定界符模式上加上括号也会返回所使用的定界符):
re.split("([ABS])", "11A4B")
#['11', 'A', '4', 'B', '']
并且可以四处寻找所需的解决方案,但是我想知道是否有一个纯正则表达式解决方案?
答案 0 :(得分:3)
改为使用re.findall
,并匹配数字后跟A
,B
或S
:
re.findall(r'\d+[ABS]', '11A4B')
输出:
['11A', '4B']
如果输入中可能还包含其他字母字符,请改用否定字符集:
re.findall(r'[^ABS]+[ABS]', 'ZZZAYYYSXXXB')
输出:
['ZZZA', 'YYYS', 'XXXB']
答案 1 :(得分:3)
一种适用于所有Python版本的解决方案将是基于PyPi regex
模块的解决方案,该模块带有regex.split
和regex.V1
标志:
import regex
ss = ["11A4B","5S6B"]
delimiters = "ABS"
for s in ss:
print(regex.split(r'(?<=[{}])(?!$)'.format(regex.escape(delimiters)), s, flags=regex.V1))
['11A', '4B']
['5S', '6B']
详细信息
(?<=[ABS])
-与后面紧跟A
,B
或S
(?!$)
-不会立即跟在字符串末尾(因此,字符串末尾的所有位置都会失败)。使用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]*
-除A
,B
和S
以外的0个以上的字符[ABS]?
-1或0(=可选)A
,B
或S
字符。答案 2 :(得分:2)
答案 3 :(得分:1)
使用findall
:
re.findall('(.*?(?:[ABS]|.$))', "11A4B5")