Python - генерирует регистронезависимую REGEXP-подобную строку

1

Как я могу автогенерировать регистр REGEXP без учета регистра для строки, которая может иметь следующий вариант: 'ENTI', 'Enti'

Я получил это до сих пор, но он выглядит неуклюжим,

entity_type = 'Enti'
prefix = 'E'
for char in entity_type[1:]:                          
    logs_prefix += '[' + char.upper() + char.lower() + ']'
print logs_prefix

>>>'E[Nn][Tt][Yy]'

Моя цель - сначала открыть список активных журналов (повернутые будут заканчиваться временной меткой), которые начинаются с заданной нечувствительной к регистру последовательности, поэтому я могу

regexp_filters = logs_prefix + '_A.out'
command = "ssh %(user)s@%(ip)s 'cd %(source_path)s; ls -t %(regexp_filters)s'" % locals()

и генерировать разные выражения rsync для ряда хостов. Игнорировать исключение, его из нескольких --excludes toolder, разбил журналы "* _A.out"

sync = "rsync -e ssh -a %(remote_rsync_binary)s --compress=9 -pgtov %(excluded_expression)s %(filters_expression)s --exclude='*' %s(user)@%(ip)s:%(source_path)s%(file_filter)s %(target_path)s" % locals()

Незначительный вопрос, как легко заключить строку /char с другими символами, в этом случае: [char]

РЕДАКТИРОВАТЬ: Нашел более чистый раствор, есть ли лучший способ?

for char in entity_type[1:]:
    prefix += "[%s]" % "%s%s" % (char.upper(), char.lower() ) 

EDIT2: (улучшение) как писал @eyquem,

prefix + ''.join( "[%s%s]" % (char.upper(), char.lower() for char in entity_type[1:])
  • 1
    Ты не можешь просто проигнорировать дело?
  • 0
    Нет. Цель состоит в том, чтобы автоматически обнаружить журналы, которые соответствуют заданному шаблону в удаленном пути (есть некоторые варианты), сгенерировать строку REGEX и передать ее команде rsync.
Показать ещё 6 комментариев
Теги:
for-loop

3 ответа

4
Лучший ответ

Попробуйте следующее:

reEnti = re.compile('ent[iy]',re.IGNORECASE)
  • 0
    Это будет делать, если целью было проанализировать диапазон объектов с помощью Python, мне нужно сгенерировать строку, которая будет использоваться в качестве REGEXP внешней командой.
1

Вы можете попробовать это (Python 2.7.1):

>>> def goofy_regexp(s):
      return '{}|{}'.format(s.upper(), s.title())

>>> goofy_regexp('enti')
'ENTI|Enti'

Здесь версия 2.6 с форматированием строки старого стиля:

>>> def goofy_regexp26(s):
    return '%s|%s' % (s.upper(), s.title())

>>> goofy_regexp26('enti')
'ENTI|Enti'
  • 0
    AttributeError: у объекта 'str' нет атрибута 'format' Это в Python 2.7 / 3.0+?
  • 0
    stack_zen: Да.
0

Я не могу поверить, что python фактически не поддерживает ignorecase в регулярном выражении. Просто передача "Ignorecase" в качестве флага для парсера регулярных выражений не лучше, чем выполнение upper() после факта и бесполезно для определения регулярного выражения case-insenstive

Ещё вопросы

Сообщество Overcoder
Наверх
Меню