Я столкнулся с какой-то странной проблемой регулярного выражения Python. Следующие две строки предположительно должны быть одинаковыми. Но как-то они не совпадают.
import re
print(" \\\"")
print(" "+chr(92)+chr(34)+"")
print(re.search(" \\\"", " "+chr(92)+chr(34)+""))
Однако следующее действительно соответствует
import re
print("\\\"")
print(""+chr(92)+chr(34)+"")
print(re.search("\\\"", ""+chr(92)+chr(34)+""))
Любая мысль о том, что здесь происходит?






Проблема в том, что символ обратной косой черты имеет особое значение для строки в python. Вы можете использовать необработанную строку Python, созданную путем добавления к строковому литералу префикса «r» или «R», где необработанная строка Python обрабатывает обратную косую черту (\) как буквальный символ.
import re
print(" \\\"")
print(" "+chr(92)+chr(34)+"")
print(re.search(r" \\\"", " "+chr(92)+chr(34)+""))
Вывод:
\"
\"
<re.Match object; span=(0, 3), match=' \\"'>
Во втором примере print(re.search("\\\"", ""+chr(92)+chr(34)+"")) выводит:
<re.Match object; span=(1, 2), match='"'> где соответствует только двойная кавычка.
Нужно избежать обратной косой черты или использовать необработанную строку. Если использовать одинарные кавычки вокруг регулярного выражения, то двойные кавычки не нужно экранировать.
s = "" + chr(92) + chr(34) + ""
print(re.search("\\\\\"", s))
print(re.search(r"\\\"", s))
print(re.search(r'\\"', s))
Вывод:
<re.Match object; span=(0, 2), match='\\"'>
<re.Match object; span=(0, 2), match='\\"'>
<re.Match object; span=(0, 2), match='\\"'>
Дополнительные сведения о необработанных строках и обратной косой черте в Python см. в ответах на этот вопрос.
Обратите внимание на результат совпадения для второго случая <re.Match object; span=(1, 2), match='"'>, который соответствует только одинарной кавычке.
так что, когда мне не от чего убежать, его просто выбросили?
если бы вы хотели сопоставить \ как буквальное, тогда нужно было бы print(re.search("\\\\\"", ""+chr(92)+chr(34)+""))
почему второй случай прошел?