Попробуйте это регулярное выражение:
^(?!\s*$)(?:(?!0+')\d+')?(?: *(?!0+")\d+")?(?: *(?!0+\/)\d+\/(?!0+$)\d+)?$
Объяснение:
[1129 ]
^
- устанавливает начало строки (?!\s*$)
- отрицательный прогноз, чтобы убедиться, что за текущим соответствием не следует 0+ пробелов, за которыми следует конец строки. Это делается для того, чтобы убедиться, что регулярное выражение не должно совпадать с пустыми строками или строками, содержащими только пробелы (?:(?!0+')\d+')?
- соответствует 1+ цифрам, за которыми следует '
. Также убедитесь, что он не совпадает с чем-то вроде 0'
. ?
в конце делает это дополнительное совпадение необязательным. (?: *(?!0+")\d+")?
- соответствует 0+ пробелам, за которыми следуют 1+ цифр и "
. Также убедитесь, что он не соответствует что-то вроде 0"
. ?
в конце делает это дополнительное совпадение необязательным. (?: *(?!0+\/)\d+\/(?!0+$)\d+)?
- соответствует 0+ пробелам, за которыми следуют дроби вида X/X
, где X - это цифра. Кроме того, он не соответствует фракциям вида 0/6
или 0/0
или 8/0
. $
- устанавливает конец строки Конечно, я думаю, что это должно быть сделано
newlist = [s for s in a_list if not any(r(s) for r in regex_list)]
РЕДАКТИРОВАТЬ : при ближайшем рассмотрении я замечаю, что ваш пример кода фактически добавляет в новый список каждую строку в a_list
, который не соответствует всем регулярным выражениям - и более того, он добавляет каждую строку один раз для каждого регулярного выражения, которое ему не соответствует. Мое понимание списка делает то, что, я думаю, вы имели в виду, то есть добавляете только одну копию каждой строки, которая не соответствует ни одному регулярных выражений.
Я бы обработал ваш код до этого:
a_list = [
'HELLO',
'FOO',
'FO1BAR',
'ROOBAR',
'SHOEBAR'
]
regex_func = lambda x: not re.search(r'(FOO|RO)', x, re.IGNORECASE)
Тогда у вас есть две опции:
Фильтр
newlist = filter (regex_func, a_list)
Список представлений
newlist = [x для x в a_list, если regex_func (x)]