К сожалению, для split
требуется совпадение с нулевой шириной, но оно еще не исправлено, так как довольно много неправильного кода зависит от текущего поведения, используя, например, [something]*
, как регулярное выражение. Использование таких шаблонов теперь будет генерировать FutureWarning
, а те, которые никогда не могут разбить что-либо, выкиньте ValueError
из Python 3.5 и далее:
>>> re.split(r'(?<!foo)(?=bar)', 'foobarbarbazbar')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.6/re.py", line 212, in split
return _compile(pattern, flags).split(string, maxsplit)
ValueError: split() requires a non-empty pattern match.
Идея в том, что после определенного периода предупреждений поведение может быть изменено так, чтобы ваше регулярное выражение снова работало.
Если вы не можете использовать модуль regex
, вы можете написать свою собственную функцию разделения используя re.finditer()
:
def megasplit(pattern, string):
splits = list((m.start(), m.end()) for m in re.finditer(pattern, string))
starts = [0] + [i[1] for i in splits]
ends = [i[0] for i in splits] + [len(string)]
return [string[start:end] for start, end in zip(starts, ends)]
print(megasplit(r'(?<!foo)(?=bar)', 'foobarbarbazbar'))
print(megasplit(r'o', 'foobarbarbazbar'))
Если вы уверены, что совпадения имеют только нулевую ширину, вы можете использовать начальные расщепления для более простого кода:
import re
def zerowidthsplit(pattern, string):
splits = list(m.start() for m in re.finditer(pattern, string))
starts = [0] + splits
ends = splits + [ len(string) ]
return [string[start:end] for start, end in zip(starts, ends)]
print(zerowidthsplit(r'(?<!foo)(?=bar)', 'foobarbarbazbar'))
Из ответа на ваш предыдущий вопрос вы знаете, что некоторые PL&F могут смять границу.
Очевидное решение - переопределить метод setBorder
, который вызывает PL&F, и отбросить изменение.
JTextField text = new JTextField() {
@Override public void setBorder(Border border) {
// No!
}
};
JTextField textField = new JTextField();
textField.setBorder(javax.swing.BorderFactory.createEmptyBorder());
http://java.sun.com/javase/6/docs/api/javax/swing/BorderFactory.html
При установке границы на 'null', вы фактически говорите программе look & feel использовать родной стиль границы (операционной системы), если таковой имеется.
Попробуйте установить для него значение BorderFactory.createEmptyBorder () вместо null. Иногда это «помогает», потому что установка значения null на самом деле имеет другое значение.
Если это не сработает, возможно, стиль, который вы используете, что-то переопределяет. Вы используете значение по умолчанию или что-то особенное?