Regex для замены символов между числами в python [duplicate]

Архитектура

Назначение значений по умолчанию в вызове функции - это запах кода.

def a(b=[]):
    pass

Это сигнатура функции, которая не подходит. Не только из-за проблем, описанных в других ответах. Я не буду вдаваться в это.

Эта функция направлена ​​на то, чтобы сделать две вещи. Создайте новый список и выполните функциональность, скорее всего, в указанном списке.

Функции, которые делают две вещи, являются плохими функциями, поскольку мы учимся на чистых практиках кода.

Атака на эту проблему с полиморфизмом мы будем расширять список python или переносить его в класс, а затем выполнять свою функцию на нем.

Но подождите, пока вы скажете, мне нравятся мои однострочные.

Ну , Угадай, что. Код - это не просто способ управления поведением оборудования. Это способ:

  • общаться с другими разработчиками, работающими над одним и тем же кодом.
  • может изменить поведение аппаратного обеспечения при появлении новых требований.
  • , способный понять поток программы после того, как вы снова забираете код через два года, чтобы сделать упомянутое выше изменение.

Не оставляйте бомбы замедленного действия для себя

Отделяя эту функцию от двух вещей, которые она делает, нам нужен класс

class ListNeedsFives(object):
    def __init__(self, b=None):
        if b is None:
            b = []
        self.b = b

    def foo():
        self.b.append(5)

Выполнено

a = ListNeedsFives()
a.foo()
a.b

И почему это лучше, чем слияние всего вышеописанного кода с одной функцией.

def dontdothis(b=None):
    if b is None:
        b = []
    b.append(5)
    return b

Почему бы не сделать это?

Если вы не сработаете в своем проекте, ваш код будет жить. Скорее всего, ваша функция будет делать больше, чем это. Правильный способ создания поддерживаемого кода состоит в том, чтобы разделить код на атомные части с должным образом ограниченным объемом.

Конструктор класса является очень общепризнанным компонентом для всех, кто сделал объектно-ориентированное программирование. Размещение логики, которая обрабатывает экземпляр списка в конструкторе, делает когнитивную нагрузку понимания того, что делает код меньше.

Метод foo() не возвращает список, почему бы и нет?

При возврате отдельного списка вы можете предположить, что безопасно делать то, что вам хочется. Но это может быть не так, поскольку он также разделяется объектом a. Заставляя пользователя ссылаться на него как a.b, он напоминает, где находится список. Любой новый код, который хочет изменить a.b, естественно, будет помещен в класс, где он принадлежит.

Функция подписи def dontdothis(b=None): не имеет ни одного из этих преимуществ.

317
задан Mechanical snail 2 October 2011 в 09:03
поделиться

8 ответов

Какими персонажами вы должны и которые вы не должны убежать, действительно зависит от того, с чем вы работаете.

Для PCRE и большинства других так называемых Perl-совместимых ароматов избегайте этих внешних классы символов:

.^$*+?()[{\|

и эти внутренние классы символов:

^-]\

Для POSIX расширенных регулярных выражений (ERE), избегайте этих внешних классов символов (таких же, как PCRE):

.^$*+?()[{\|

Выключение любых других символов является ошибкой с POSIX ERE.

Внутри классов символов обратная косая черта является буквальным символом в регулярных выражениях POSIX. Вы не можете использовать его, чтобы избежать чего-либо. Вы должны использовать «умное размещение», если хотите включить метасимволы класса символов в виде литералов. Поместите ^ в любом месте, кроме как в начале, в начале, а в начале или в конце класса символов, чтобы соответствовать этим буквально, например:

[]^-]

В основных регулярных выражениях POSIX (BRE), это метасимволы, которые вам нужно убежать, чтобы подавить их смысл:

.^$*

Выпуски из круглых скобок и фигурных скобок в BRE дают им особый смысл, который их неописуемые версии имеют в ERE. Некоторые реализации (например, GNU) также придают особое значение другим символам при экранировании, например \? и +. Сброс символа, отличного от. ^ $ * () {}, Как правило, является ошибкой с BRE.

Внутри классов символов BRE следуют тому же правилу, что и ERE.

Если все это делает голова спина, возьмите копию RegexBuddy . На вкладке «Создать» нажмите «Вставить маркер», а затем «Литерал». RegexBuddy добавит экраны при необходимости.

302
ответ дан Jan Goyvaerts 21 August 2018 в 01:22
поделиться
  • 1
    Мне кажется, вы забыли «/», который также нужно избегать вне класса. – jackthehipster 14 January 2015 в 09:23
  • 2
    / не является метасимволом в любом из ароматов регулярного выражения, о котором я упоминал, поэтому синтаксис регулярных выражений не требует его ускорения. Когда регулярное выражение цитируется как литерал на языке программирования, тогда правила форматирования строки или регулярного выражения этого языка могут потребовать экранирования / или " или ' и могут даже потребовать `\` вдвойне сбежал. – Jan Goyvaerts 7 February 2015 в 00:39
  • 3
    как насчет двоеточия, & quot;: & quot ;? Должна ли она скрываться внутри классов персонажей, а также снаружи? ru.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions говорит, что «PCRE имеет последовательные правила экранирования: любой неабсолютно-буквенный символ может быть экранирован, чтобы обозначить его буквальное значение [...] & quot; – nicolallias 22 May 2015 в 14:05
  • 4
    Может быть экранировано не то же самое, что СЛЕДУЕТ сбежать. Синтаксис PCRE никогда не требует вытеснения буквенного двоеточия, поэтому экранирование букв colons только упрощает чтение вашего регулярного выражения. – Jan Goyvaerts 9 June 2015 в 07:52
  • 5
    Для не-POSIX ERE (тот, который я использую чаще всего, потому что это то, что реализовано Tcl), избегая других вещей, не генерирует ошибок. – slebetman 21 August 2015 в 04:47

Modern RegEx Flavors (PCRE)

Включает C, C ++, Delphi, EditPad, Java, JavaScript, Perl, PHP (preg), PostgreSQL, PowerGREP, PowerShell, Python, REALbasic, Real Studio, Ruby , TCL, VB.Net, VBScript, wxWidgets, XML Schema, Xojo, XRegExp.PCRE совместимость может различаться

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Anywhere: . ^ $ * + - ? ( ) [ ] { } \ |


Legacy RegEx Flavors (BRE / ERE)

Включает поддержку awk, ed, egrep, emacs, GNUlib, grep, PHP (ereg), MySQL, Oracle, R, sed.PCRE версии или с помощью расширений

ERE / awk / egrep / emacs

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Вне класса символов: . ^ $ * + ? ( ) [ { } \ | & nbsp; & nbsp; & nbsp; & nbsp; Внутри класса символов: ^ - [ ]

BRE / ed / grep / sed

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; ; & nbsp; внутри класса символов: ^ - [ ] & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; g16]


Примечания

  • Если неуверенность a bout с определенным символом, он может быть экранирован как \xFF
  • Буквенно-цифровые символы не могут быть экранированы с помощью обратного слэша
  • Произвольные символы могут быть экранированы с помощью обратного слэша в PCRE, но не BRE / ERE (при необходимости их нужно избегать). Для PCRE ] - требуется только экранирование в классе символов, но я сохранил их в одном списке для простоты
  • . Цитированные строки выражения также должны иметь экранированные символы пробега, а часто с обратной косой чертой удвоились ( как "(\")(/)(\\.)" по сравнению с /(")(\/)(\.)/ в JavaScript)
  • . Помимо экранов, различные реализации регулярных выражений могут поддерживать различные модификаторы, классы символов, якоря, кванторы и другие функции. Для получения дополнительной информации посмотрите regular-expressions.info или используйте regex101.com , чтобы проверить свои выражения в реальном времени
41
ответ дан Beejor 21 August 2018 в 01:22
поделиться
  • 1
    – Jan Goyvaerts 23 February 2017 в 09:05
  • 2
    @JanGoyvaerts Спасибо за исправление. Вы упомянули о вкусах, которые ближе к PCRE. Что касается побегов, я сохранил их таким образом для простоты; легче запомнить, чтобы убежать повсюду, чем несколько исключений. Властные пользователи будут знать, что происходит, если они хотят избежать нескольких обратных косых черт. Во всяком случае, я обновил свой ответ несколькими разъяснениями, которые, надеюсь, затронут некоторые из этих вещей. – Beejor 7 March 2017 в 04:15

Действительно, нет. существует около полумиллиона различных синтаксисов регулярных выражений; они, похоже, доходят до Perl, EMACS / GNU и AT & amp; T в целом, но я всегда удивляюсь.

2
ответ дан Charlie Martin 21 August 2018 в 01:22
поделиться

К сожалению, значение таких вещей, как (и \ (меняются между регулярными выражениями стиля Emacs и большинством других стилей). Поэтому, если вы попытаетесь избежать этого, вы можете делать противоположное тому, что вы хотите.

Итак, вам действительно нужно знать, какой стиль вы пытаетесь процитировать.

3
ответ дан Darron 21 August 2018 в 01:22
поделиться

К сожалению, на самом деле нет установленного набора escape-кодов, поскольку он зависит от языка, который вы используете.

Однако сохранение страницы, такой как Страница регулярных выражений ] или этот Regular Cheatsheet может пройти долгий путь, чтобы помочь вам быстро отфильтровать информацию.

20
ответ дан Dillie-O 21 August 2018 в 01:22
поделиться
  • 1
    Обширный лист Addedbytes сильно упрощен и имеет некоторые вопиющие ошибки. Например, он говорит, что \< и \> являются границами слов, что истинно только (AFAIK) в библиотеке регулярных выражений Boost. Но в другом месте он говорит, что < и > являются метасимволами и должны быть экранированы (до \< и \>), чтобы соответствовать им буквально, что не соответствует ни одному из вкусов – Alan Moore 7 March 2017 в 06:00

POSIX распознает множество вариантов регулярных выражений - основных регулярных выражений (BRE) и расширенных регулярных выражений (ERE). И даже тогда есть причуды из-за исторических реализаций утилит, стандартизированных POSIX.

Нет простого правила, когда использовать эту нотацию или даже какую нотацию использовать для данной команды.

Зайдите в книгу Джеффа Фридля , посвященной регулярным выражениям .

4
ответ дан Jonathan Leffler 21 August 2018 в 01:22
поделиться

Иногда с помощью персонажей, которые вы указали, возможно простое экранирование. Например, использование обратной косой черты для выхода из скобки не будет работать в левой части строки подстановки в sed, а именно

sed -e 's/foo\(bar/something_else/'

. Я просто использую простое определение класса символов вместо , поэтому вышеприведенное выражение становится

sed -e 's/foo[(]bar/something_else/'

, которое я нахожу для большинства реализаций регекса.

BTW Классы символов являются довольно ванильными элементами регулярного выражения, поэтому они, как правило, работают в большинстве ситуаций, когда вы нужны экранированные символы в регулярных выражениях.

Изменить: после комментария ниже, просто подумал, что я бы упомянул о том, что вам также нужно учитывать разницу между автоматами конечного состояния и автоматами не конечного состояния при просмотре поведение оценки regexp.

Возможно, вам захочется взглянуть на «блестящую книгу с шаром», а также на эффективную Perl ( санированную ссылку Amazon ), в частности главу о регулярных выражениях, чтобы получить почувствуйте тогда разницу в типах оценки двигателя regexp.

Не все в мире PCRE!

В любом случае, регулярные выражения настолько неуклюжи по сравнению с SNOBOL ! Теперь это был интересный курс программирования! Наряду с тем, что на Simula .

Ах, радости изучения в UNSW в конце 70-х! (-:

3
ответ дан vaxquis 21 August 2018 в 01:22
поделиться
  • 1
    «sed» - это команда, для которой plain '(' не является особенной, но '\ (' является особенной, в отличие от PCRE меняет смысл, поэтому '(' is special, но '\ (' is not. ОП спрашивает. – Jonathan Leffler 30 December 2008 в 09:43
  • 2
    sed - это утилита * nix, которая использует один из самых примитивных наборов оценки regexp. PCRE не входит в ситуацию, которую я описываю, поскольку она включает в себя другой класс (в) конечных автоматов с тем, как он оценивает регулярные выражения. Я думаю, что мое предложение о минимальном наборе синтаксиса regexp по-прежнему сохраняется. – Rob Wells 31 December 2008 в 02:32
  • 3
    В POSIX-совместимой системе sed использует POSIX BRE, который я рассказываю в своем ответе. Версия GNU на современной Linux-системе использует POSIX BRE с несколькими расширениями. – Jan Goyvaerts 31 December 2008 в 08:30

Для PHP, «всегда безопасно предшествовать не-буквенно-цифровому с« \ », чтобы указать, что он обозначает себя». - http://php.net/manual/en/regexp.reference.escape.php .

За исключением случаев, когда это «или».: /

Чтобы избежать переменных шаблона регулярных выражений (или частичных переменных) в PHP, используйте preg_quote ()

1
ответ дан zylstra 21 August 2018 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: