Понимания списка и условия?

Попробуйте это регулярное выражение:

^(?!\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.
  • $ - устанавливает конец строки
    • 7
      задан pradyunsg 4 March 2013 в 05:45
      поделиться

      2 ответа

      Конечно, я думаю, что это должно быть сделано

      newlist = [s for s in a_list if not any(r(s) for r in regex_list)]
      

      РЕДАКТИРОВАТЬ : при ближайшем рассмотрении я замечаю, что ваш пример кода фактически добавляет в новый список каждую строку в a_list , который не соответствует всем регулярным выражениям - и более того, он добавляет каждую строку один раз для каждого регулярного выражения, которое ему не соответствует. Мое понимание списка делает то, что, я думаю, вы имели в виду, то есть добавляете только одну копию каждой строки, которая не соответствует ни одному регулярных выражений.

      18
      ответ дан 6 December 2019 в 10:53
      поделиться

      Я бы обработал ваш код до этого:

      a_list = [
                'HELLO',
                'FOO',
                'FO1BAR',
                'ROOBAR',
                'SHOEBAR'
                ]
      regex_func = lambda x: not re.search(r'(FOO|RO)', x, re.IGNORECASE)    
      

      Тогда у вас есть две опции:

      1. Фильтр

        newlist = filter (regex_func, a_list)

      2. Список представлений

        newlist = [x для x в a_list, если regex_func (x)]

      0
      ответ дан 6 December 2019 в 10:53
      поделиться
      Другие вопросы по тегам:

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