Если вы используете консоль Eclipse, на работе, похоже, работают два разных явления: один, как описано в @Gemtastic , является обработкой потоков JVM, а другой - способом Eclipse читает эти потоки, как упоминалось @DraganBozanovic . Поскольку я использую Eclipse, недостаточно -потока @BillK , которая касается только проблемы с JVM, [40]
В итоге я написал класс-помощник под названием EclipseTools
со следующим содержимым (и требуемым объявлением и импортом пакета). Это немного хак, но исправлены обе проблемы:
public class EclipseTools {private static List & lt; OutputStream & gt; streams = null; private static OutputStream lastStream = null; private static class FixedStream расширяет OutputStream {private final OutputStream target; public FixedStream (OutputStream originalStream) {target = originalStream; streams.add (это); } @Override public void write (int b) throws IOException {if (lastStream! = This) swap (); target.write (б); } @Override public void write (byte [] b) throws IOException {if (lastStream! = This) swap (); target.write (б); } @Override public void write (byte [] b, int off, int len) throws IOException {if (lastStream! = This) swap (); target.write (b, off, len); } private void swap () throws IOException {if (lastStream! = null) {lastStream.flush (); попробуйте {Thread.sleep (200); } catch (InterruptedException e) {}} lastStream = this; } @Override public void close () throws IOException {target.close (); } @Override public void flush () выдает IOException {target.flush (); }} / ** * Вставляет задержку 200 мс в System.err или System.out OutputStreams * каждый раз, когда выход переключается с одного на другой. Это не позволяет * консоли Eclipse показывать вывод двух потоков из * заказа. Эту функцию нужно вызвать только один раз. * / public static void fixConsole () {if (streams! = null) return; streams = new ArrayList & lt; OutputStream & gt; (); System.setErr (новый PrintStream (новый FixedStream (System.err))); System.setOut (новый PrintStream (новый FixedStream (System.out))); }}
Чтобы использовать, просто вызовите EclipseTools.fixConsole ()
один раз в начале вашего кода.
В основном это заменяет два потока System.err
и System.out
с настраиваемым набором потоков, которые просто пересылают свои данные в исходные потоки, но отслеживают, какой поток был записан последним. Если поток, который записывается для изменений, например, System.err.something (...)
, за которым следует System.out.something (...)
, он сбрасывает выходные данные последнего потока и ждет 200 мс, чтобы дать время консоли Eclipse завершить его печать.
Примечание: 200 мс - это просто приблизительное начальное значение. Если этот код уменьшает, но не устраняет проблему для вас, увеличьте задержку в Thread.sleep
от 200 до уровня выше, пока он не будет работать. В качестве альтернативы, если эта задержка работает, но влияет на производительность вашего кода (если вы чередуете потоки часто), вы можете попытаться уменьшить его постепенно, пока не начнете получать ошибки.
Regex движок Python не поддерживает эти; см. & sect; 7.2.1 «Синтаксис регулярного выражения» в документации Python для списка того, что он поддерживает . Однако вы можете получить тот же эффект, написав re.match(re.escape("bla"), "bla")
; re.escape
- функция, которая вставляет обратные косые черты перед всеми специальными символами.
Кстати, вы обычно должны использовать «сырые» строки r"..."
вместо "..."
, так как в противном случае обратная косая черта будет обработана дважды (один раз, когда строка разбирается, а затем снова с помощью механизма регулярных выражений), что означает, что вы должны писать такие вещи, как \\b
, а не \b
. Использование r"..."
предотвращает передачу первой обработки, поэтому вы можете просто написать \b
.
Python не поддерживает \ Q ... \ E. Ссылка: http://www.regular-expressions.info/refflavors.html
Но это не означает, что он не поддерживает экранирование строк метасимволов. Ссылка: http://docs.python.org/library/re.html#re.escape
К сожалению, Python не поддерживает escape-последовательности \Q
и \E
. Вам просто нужно все уйти.