Эквивалент Python цитирования Java Regex [дубликат]

Если вы используете консоль 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 до уровня выше, пока он не будет работать. В качестве альтернативы, если эта задержка работает, но влияет на производительность вашего кода (если вы чередуете потоки часто), вы можете попытаться уменьшить его постепенно, пока не начнете получать ошибки.

5
задан wafwaf 7 March 2012 в 22:10
поделиться

3 ответа

Regex движок Python не поддерживает эти; см. & sect; 7.2.1 «Синтаксис регулярного выражения» в документации Python для списка того, что он поддерживает . Однако вы можете получить тот же эффект, написав re.match(re.escape("bla"), "bla"); re.escape - функция, которая вставляет обратные косые черты перед всеми специальными символами.

Кстати, вы обычно должны использовать «сырые» строки r"..." вместо "...", так как в противном случае обратная косая черта будет обработана дважды (один раз, когда строка разбирается, а затем снова с помощью механизма регулярных выражений), что означает, что вы должны писать такие вещи, как \\b, а не \b. Использование r"..." предотвращает передачу первой обработки, поэтому вы можете просто написать \b.

11
ответ дан ruakh 15 August 2018 в 17:11
поделиться
  • 1
    Благодарю. Я бы ожидал получить исключение при вставке не поддерживаемого регулярного выражения. О, подождите, это python ... – wafwaf 7 March 2012 в 22:21
  • 2
    Пожалуйста. И да. , , Я понимаю, почему люди так любят Python, но. , , – ruakh 7 March 2012 в 22:27
  • 3
    @ruakh Это не для регулярных выражений, поверьте. :) – tchrist 7 March 2012 в 22:29

Python не поддерживает \ Q ... \ E. Ссылка: http://www.regular-expressions.info/refflavors.html

Но это не означает, что он не поддерживает экранирование строк метасимволов. Ссылка: http://docs.python.org/library/re.html#re.escape

1
ответ дан simplyharsh 15 August 2018 в 17:11
поделиться

К сожалению, Python не поддерживает escape-последовательности \Q и \E. Вам просто нужно все уйти.

1
ответ дан Taymon 15 August 2018 в 17:11
поделиться
Другие вопросы по тегам:

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