对于 python 程序,我有一个从 stdin
获取的输入,输入类似于:
"-------/--------\---------/------\"
当我将其打印为字符串值时,它会按原样打印。我试图将字符串拆分为基于正斜杠和反斜杠的字符串列表,同时保留分隔符。我用过这样的东西:
re.split('(\\/)',string)
但我得到的结果是:
['------' , '/' , '--------\\\\---------' , '/' , '---------\\\']
我更希望它是这样的:
['------' , '/' , '---------' , '\' , '---------', '/' , '---------' , '\']
我在这里做错了什么以及如何解决这个问题?
最佳答案
要捕获分隔符,使用 findall
而不是 split
更容易:
re.findall(r'[^\\/]+|[\\/]', string)
[^\\/]+
将查找 1 次或多次出现的不包含正斜杠或反斜杠的子字符串。 |
用作或运算符。最后,[\\/]
将匹配正斜杠和反斜杠的出现。结果将为出现的正斜杠和反斜杠以及未出现的字符串匹配提供单独的子字符串。
至于为什么你的代码不起作用,你的表达式是(\\/)
。当 Python 解释器解析它时,它会看到一个转义斜杠并创建一个由四个字符组成的字符串:(\/)
。然后,该字符串被发送到正则表达式引擎,该引擎也会进行转义。它看到一个斜杠后面跟着一个反斜杠,并且由于反斜杠并不特殊,它会“转义”到自身,因此最终的表达式只是 (/)
。最后,重新应用此表达式,用反斜杠分隔并捕获它 - 正是您所观察到的。
由于双重转义,您的方法的正确命令是 re.split('([\\\/])',string)
。
故事的寓意:始终将原始文字 r"..."
与正则表达式一起使用,以避免双重转义问题。
关于python - 使用正则表达式使用反斜杠分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23360441/