Python re.sub для удаления одинарных кавычек и двойных кавычек из строки

Вот вопрос, который быстро сводит меня с ума. Я хочу удалить символы ' и из строки. Я хочу использовать re.sub для этого (потому что я пытаюсь сравнить re.sub и str.replace, поэтому я хочу сделать это в обоих направлениях). Теперь мое понимание необработанных строк заключается в том, что escape-символы обрабатываются как литералы, ЕСЛИ они не экранируют символ, открывающий строку. Итак, у меня есть две идеи, как это сделать:

# Method 1: concatenate strings that have different enclosing characters
>>> REGEX1 = re.compile(r"[" + r'"' + r"'" + r"]")
>>> REGEX1.pattern
'["\']'
# Method 2: Try to escape one of the quotation characters
>>> REGEX2= re.compile(r"[\"']")
>>> REGEX2.pattern
'[\\"\']'

Приведенные узоры ВЫГЛЯДЯТ по-разному. Хотя они? Я проверяю, ведут ли они себя одинаково в регулярном выражении:

>>> test_string = "hello ' world \" "
>>> test_string
'hello \' world " '
>>> result_1 = REGEX1.sub(r'', test_string)
>>> result_2 = REGEX2.sub(r'', test_string)
>>> result_1
'hello  world  '
>>> result_2
'hello  world  '
>>> 

Моя интуиция подсказывает мне, что возможно одно из двух:

  1. '[']' == '[\']'
  2. '[']' != '[\']', но будет вести себя аналогично при обработке как регулярное выражение.

Тогда последний тест:

>>> '["\']' == '[\\"\']'                                                                                                                                                                                      
False

Итак, 2) выше правильное утверждение? Можете ли вы помочь мне понять, что происходит?


person Neil    schedule 15.11.2020    source источник


Ответы (1)


Они выглядят по-разному, как показано при отображении их значений, но поскольку они интерпретируются как регулярные выражения, они эквивалентны:

import re


REGEX1 = re.compile(r"[" + r'"' + r"'" + r"]")
print(REGEX1.pattern)
print(REGEX1.sub('', """abc"'def"""))
REGEX2= re.compile(r"[\"']")
print(REGEX2.pattern)
print(REGEX2.sub('', """abc"'def"""))

Отпечатки:

["']
abcdef
[\"']
abcdef 

Пояснение

Разница между необработанной строкой r'\n' и неисходной строкой '\n' огромна, потому что последняя представляет собой специальную управляющую последовательность, которая соответствует символу новой строки, тогда как первая эквивалентна '\\n', то есть двухсимвольной последовательности обратной косой черты, за которой следует символ буква н. Но для других случаев, таких как '\", где обратная косая черта, за которой следует двойная кавычка, не является специальной escape-последовательностью, обратная косая черта является лишней и может быть проигнорирована, и, таким образом, ["'] и [\"'] эквивалентны.

Обновить

Поскольку я указал на то, что в целом существует большая разница между escape-последовательностями в необработанных строках и не необработанных строках, когда то, что следует за обратной косой чертой, имеет особое значение после обратной косой черты (например, r'\n' против '\n'), это не всегда так. для всех намерений и целей с регулярными выражениями. Например, при использовании в регулярных выражениях механизм регулярных выражений Python будет сопоставлять символ новой строки либо с регулярным выражением, скомпилированным из двухсимвольной последовательности r'\n' (то есть '\\n'), либо с символом новой строки '\n':

import re


REGEX1 = re.compile('a\nb') # use actual newline
print('pattern1 = ', REGEX1.pattern)
print(REGEX1.search('a\nb'))
REGEX2 = re.compile(r'a\nb') # use '\\n'
print('pattern 2 =', REGEX2.pattern)
print(REGEX2.search('a\nb'))

Отпечатки:

pattern1 =  a
b
<re.Match object; span=(0, 3), match='a\nb'>
pattern 2 = a\nb
<re.Match object; span=(0, 3), match='a\nb'>

Но необработанные строки обычно используются из-за ситуаций, когда вам может понадобиться, например, r'\1' для возврата к группе захвата 1, а '\1' соответствует '\x01'.

person Booboo    schedule 15.11.2020