Предположим, у меня есть рабочий процесс, который включает в себя изучение начала длинной строки (LS
, скажем), чтобы узнать, начинается ли она с более короткой строки SS
. Если это так, я отрубаю соответствующую часть LS
и сделаю что-нибудь с оставшейся частью. В противном случае я делаю что-то еще. (Конкретным случаем, вызвавшим этот вопрос, была библиотека для разбора.)Как удалить одну строку с начала другого, если я знаю, что более длинная строка не учитывает регистр-регистр?
def do_thing(LS, SS):
if (LS.startswith(SS)):
action_on_match(LS[len(SS):])
else:
action_on_no_match()
Это просто. Теперь, однако, предположим, что я хочу сделать то же самое, но на этот раз я хочу, чтобы строки были сопоставлены без учета регистра. Можно проверить, «LS.startswith(SS)
, но без учета регистра». Но как мне определить, сколько из LS
«отрубить», когда я передаю его action_on_match()
? Недостаточно просто использовать len(SS)
, как и раньше, потому что, если я занимаюсь верхним или нижним индексом или случаем, то длина совпадающего префикса LS
может быть не такой, какой я ожидаю: изменение случая строки может измениться его длина. Важно, чтобы часть LS
была передана в action_on_match()
, и именно то, что программа получила в качестве ввода (после точки отсечки, конечно).
отвечающие предложил использовать lower()
и консервирование использования len(SS)
, но это не будет работать:
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 32 bit (In
tel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> def action_on_match (s): return "Match: %s" % s
...
>>> def action_on_no_match(): return "No match"
...
>>> def do_thing (LS, SS):
... if LS.lower().startswith(SS.lower()):
... return action_on_match(LS[len(SS):])
... else:
... return action_on_no_match()
...
>>> do_thing('i\u0307asdf', '\u0130')
'Match: \u0307asdf'
>>>
Здесь мы ожидаем увидеть 'Match: asdf'
, но есть дополнительный характер.
'изменение регистра строки может изменить свою length': Можете ли вы подробнее рассказать о том, что ..? –
@mu, U + 00DF LATIN SMALL LETTER SHARP S становится «SS» при преобразовании в верхний регистр. U + 0130 LATIN CAPITAL LETTER I С DOT ABOVE становится двумя символами (U + 0069 LATIN SMALL LETTER I и U + 0307 COMBINING DOT ABOVE) при преобразовании в нижний регистр. – Hammerite
Это питон 2 или 3? –