• Как исправить ошибку связанную с FULL JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    MySQL в принципе не знает о существовании FULL JOIN. И это как раз тот редчайший случай, когда сообщение об ошибке не соответствует проблеме.

    Проблема решается эмуляцией. Есть как минимум два варианта:

    SELECT * FROM table1 LEFT JOIN table2 USING (column)
    UNOIN ALL
    SELECT * FROM table1 RIGHT JOIN table2 USING (column) WHERE table1.column IS NULL

    SELECT *
    FROM (
        SELECT DISTINCT column FROM table1
        UNION ALL
        SELECT DISTINCT column FROM table2
        ) AS table0
    LEFT JOIN table1 USING (column)
    LEFT JOIN table2 USING (column)

    Во втором варианте кажется, что DICTINCT не нужны - но с ними работать будет заметно быстрее, особенно если поле индексировано.
    Ответ написан
    2 комментария
  • Как исправить ошибку с регулярными выражениями?

    @o5a
    Если пытались исключить все символы из набора, то надо было их заключить в квадратные скобки.
    text = re.sub('[–—!"#$%&()*,-./:;<=>@[\\]^_`{|}~\t\n\xa0–\ufeff]', '', str(text))

    А в изначальном виде у вас написан не набор символов, а последовательный шаблон поиска.
    Лучше почитайте хотя бы основы регулярных выражений, поймете ошибку.
    Но помимо этого Вы что-то странное делаете: из списка формируете строку зачем-то str(text) и из нее удаляете символы. Вы не умеет работать со списками? Для чего это было нужно?
    Ответ написан
    Комментировать
  • Как исправить ошибку с регулярными выражениями?

    Vindicar
    @Vindicar
    RTFM!
    Ну так почитай основы.
    Во-первых, используй r-строки, чтобы не натыкаться на проблемы с символом \.
    Во-вторых, изучи зарезервированные символы регулярных выражений, а именно: ( ) [ ] ^ $ . ? * +. Если тебе нужен этот символ как просто символ, его надо экранировать! Т.е. если тебе нужно совпадение с символом ?, надо писать \?.
    В-третьих, для поиска символа из указанного набора используются квадратные скобки, т.е. [abc] совпадёт с одним символом из указанных: a, b или c. Для задания диапазона можно сделать так: [a-z]. Это зачастую короче.
    В-четвёртых, для поиска символа НЕ из указанного набора используется такой синтаксис: [^abc]
    В-пятых, есть заранее заданные наборы. Например, \w описывает словесные символы (буквы, цифры и подчёркивание), \d описывает цифры, и т.д. Аналогично, \W и \D описывают всё кроме словесных символов и цифр, соотв.
    Тогда у тебя будет два варианта
    Если подчёркивание - не проблема:
    re.sub(r'\W', '', 'test:_:test', re.I)  # даст test_test

    Если подчёркивание тоже нужно убрать:
    re.sub(r'[\W_]', '', 'test:_:test', re.I)  # даст testtest
    Ответ написан
    1 комментарий