使用正则表达式使用反斜杠拆分字符串

时间:2014-04-29 09:14:53

标签: python regex string split

对于python程序,我有一个我从stdin获取的输入,输入类似于:

"-------/--------\---------/------\"

当我将其打印为字符串值时,它将按原样打印。我试图将字符串拆分为基于正向和反向斜线的字符串列表,同时保持分隔符。我用过这样的东西:

re.split('(\\/)',string)

但我得到的结果是:

['------' , '/' , '--------\\\\---------' , '/' , '---------\\\']

我非常期待它像:

['------' , '/' , '---------' , '\' , '---------', '/' , '---------' , '\']

我在这里做错了什么以及如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

要捕获分隔符,使用findall代替split会更容易:

re.findall(r'[^\\/]+|[\\/]', string)

[^\\/]+会发现一个或多个不包含正斜杠或反斜杠的子字符串。 |作为运营商运营。最后,[\\/]将匹配前向和后向斜杠的出现。结果将为前向和后向斜杠的出现提供单独的子字符串,并且不会出现字符串匹配。

至于为什么你的代码不起作用,你的表达式是(\\/)。当Python解释器解析它时,它会看到一个转义的斜杠并创建一个包含四个字符的字符串:( \ / )。然后,此字符串将发送到正则表达式引擎,该引擎也会进行转义。它看到一个斜杠后跟一个反斜杠,并且由于反斜杠并不特殊,它会“逃逸”到自身,所以最后的表达式只是(/)。最后,重新应用这个表达式,用反斜杠分割并捕获它 - 正是你正在观察的内容。

由于双重转义,您的方法的正确命令为re.split('([\\\/])',string)

故事的寓意:始终使用带有正则表达式的原始文字r"..."来避免双重逃避问题。

答案 1 :(得分:0)

我认为,这个解决方案可以提供您想要的内容:

import re
testStr = '-------/--------\\---------/------\\'
parts = re.split('(\\\\|/)', testStr)
for p in parts:
    print('p=' + p)

结果:

p=-------
p=/
p=--------
p=\
p=---------
p=/
p=------
p=\
p=