对于python程序,我有一个我从stdin
获取的输入,输入类似于:
"-------/--------\---------/------\"
当我将其打印为字符串值时,它将按原样打印。我试图将字符串拆分为基于正向和反向斜线的字符串列表,同时保持分隔符。我用过这样的东西:
re.split('(\\/)',string)
但我得到的结果是:
['------' , '/' , '--------\\\\---------' , '/' , '---------\\\']
我非常期待它像:
['------' , '/' , '---------' , '\' , '---------', '/' , '---------' , '\']
我在这里做错了什么以及如何解决这个问题?
答案 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=