Невозможно правильно проанализировать строку с помощью модификации символов

Вы должны заполнить атрибут «Button» класса «CompoundButton» с помощью пути для рисования XML (my_checkbox). В XML-чертеже вы должны иметь:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_checked="false" android:drawable="@drawable/checkbox_not_checked" />
     <item android:state_checked="true" android:drawable="@drawable/checkbox_checked" />
     <item android:drawable="@drawable/checkbox_not_checked" /> <!-- default -->
</selector>

Не забудьте заменить my_checkbox на ваше имя файла флажка drawable, checkbox_not_checked с помощью вашего PNG-файла, который является вашим флажком, когда он не установлен, и checkbox_checked с ваше изображение, когда оно проверено.

Для размера непосредственно обновите параметры макета.

0
задан benvc 5 March 2019 в 21:10
поделиться

3 ответа

Я думаю, что решение регулярных выражений будет легче понять здесь. Это берет слова, которые заканчиваются заглавными буквами и добавляет подчеркивание и делает их строчными

import re

s = "courseID pathID apiID exampleABC DEF"

def underscore_lower(match):
    return "_" + match.group(1).lower()

pat = re.compile(r'(?<=[^A-Z\s])([A-Z]+)\b')

print(pat.sub(underscore_lower, s))
# course_id path_id api_id example_abc DEF

Возможно, вам придется поиграть с этим регулярным выражением, чтобы заставить его делать именно то, что вы хотите. На данный момент он принимает заглавные буквы в конце слов, которым предшествует символ, который не является ни заглавной буквой, ни пробелом. Затем он делает эти буквы строчными и добавляет подчеркивание перед ними.

0
ответ дан Patrick Haugh 5 March 2019 в 21:10
поделиться

Проблема с вашим исправленным кодом заключается в том, что index находит только первый вхождение заглавной буквы в строке. Поскольку вы повторяли экземпляры с одинаковыми заглавными буквами, функция никогда не находит последующие экземпляры. Вы можете упростить свой подход и избежать этой проблемы, просто объединяя буквы с подчеркиванием или без подчеркивания, в зависимости от того, являются ли они заглавными буквами при итерации.

Например:

def underscore_caps(s):
    result = ''
    for c in s:
        if c.isupper():
            result += f'_{c.lower()}'
        else:
            result += c

    return result

print(underscore_caps('courseID pathID apiID'))
# course_i_d path_i_d api_i_d

Или немного более кратко, используя понимание списка и join:

def underscore_caps(s):
    return ''.join([f'_{c.lower()}' if c.isupper() else c for c in s])

print(underscore_caps('courseID pathID apiID'))
# course_i_d path_i_d api_i_d
0
ответ дан benvc 5 March 2019 в 21:10
поделиться

У вас есть ряд проблем с вашим кодом:

  1. string.index(letter) дает индекс первого вхождения letter, поэтому, если у вас есть несколько, например, D, pos будет обновляться только до положения первого. Вы можете исправить это, перебирая как позицию, так и букву, используя enumerate, например. for pos, letter in enumerate(string):
  2. Вы ставите подчеркивание перед каждой заглавной буквой, т.е. _i_d
  3. Вы перезаписываете предыдущие правки, ссылаясь на string в parsed_string=string[:pos] + '_' + string[pos:]
  4. ]

Исправление всех этих проблем, которые у вас возникли бы:

def parse_variables(string):
    new_string=''
    for pos, letter in enumerate(string):
        if letter.isupper() and pos+1 < len(string) and string[pos+1].isupper():
            new_string += f'_{letter}'
        else:
            new_string += letter
    return new_string.lower()

Но гораздо более простой метод:

"courseID pathID apiID".replace('ID', '_id')
<час>

Обновление: ]

Учитывая разнообразие строк, которые вы хотите захватить, кажется, что регулярное выражение - это инструмент, который вы хотите использовать:

import re

def parse_variables(string, pattern=r'(?<=[a-z])([A-Z]+)', prefix='_'):
    """Replace patterns in string with prefixed lowercase version.
    Default pattern is any substring of consecutive
    capital letters that occur after a lowercase letter."""

    foo = lambda pat: f'{prefix}{pat.group(1).lower()}'
    return re.sub(pattern, foo, text)

text = 'courseID pathProjects apiCode'
parse_variables(text)

>>> course_id path_projects api_code
0
ответ дан ukemi 5 March 2019 в 21:10
поделиться
Другие вопросы по тегам:

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