Почему объекты списка split () возвращаются пустым? [Дубликат]

В дополнение к настройке default_charset в php.ini вы можете отправить правильную кодировку с помощью header() из вашего кода перед любым выходом:

header('Content-Type: text/html; charset=utf-8');

Работа с Unicode в PHP легко, если вы понимаете, что большинство строковых функций не работают с Unicode, а некоторые могут полностью блокировать строки. PHP считает, что «символы» имеют длину 1 байт. Иногда это нормально (например, explode() ищет только последовательность байтов и использует его как разделитель - так что неважно, какие фактические персонажи вы ищете). Но в других случаях, когда функция фактически предназначена для работы с символами , PHP не знает, что ваш текст имеет многобайтовые символы, которые находятся в Unicode.

Хорошая библиотека для проверки есть phputf8 . Это перезаписывает все «плохие» функции, чтобы вы могли безопасно работать с строками UTF8. Существуют расширения, такие как расширение mbstring, которые тоже пытаются это сделать для вас, но я предпочитаю использовать библиотеку, потому что она более переносимая (но я пишу продукты массового рынка, так что это важно для меня). Но phputf8 может использовать mbstring за кулисами, во всяком случае, для повышения производительности.

19
задан tonga 30 May 2013 в 17:01
поделиться

4 ответа

Не используйте re.split(), используйте метод groups() объектов regex Match / SRE_Match.

>>> f = '000014_L_20111007T084734-20111008T023142.txt'
>>> time_info = re.search(r'[LU]_(\w+)-(\w+)\.', f).groups()
>>> time_info
('20111007T084734', '20111008T023142')

Вы даже можете назвать группы захвата и получить их в dict, хотя для этого вы используете groupdict(), а не groups(). (Шаблон регулярного выражения для такого случая будет похож на r'[LU]_(?P<groupA>\w+)-(?P<groupB>\w+)\.')

14
ответ дан JAB 31 August 2018 в 22:37
поделиться

Если временные метки всегда после второго _, вы можете использовать str.split и str.strip:

>>> strs = "000014_L_20111007T084734-20111008T023142.txt"
>>> strs.strip(".txt").split("_",2)[-1].split("-")
['20111007T084734', '20111008T023142']
2
ответ дан Ashwini Chaudhary 31 August 2018 в 22:37
поделиться
>>> f='000014_L_20111007T084734-20111008T023142.txt'
>>> f[10:-4].split('-')
['0111007T084734', '20111008T023142']

или, несколько более общий:

>>> f[f.rfind('_')+1:-4].split('-')
['20111007T084734', '20111008T023142']
1
ответ дан Elazar 31 August 2018 в 22:37
поделиться

Я не эксперт Python, но, может быть, вы могли бы просто удалить пустые строки из вашего списка?

time_info = re.split('^[0-9]+_[LU]_|-|\.txt$', f)
time_info = filter(None, str_list)
14
ответ дан Elliot Bonneville 31 August 2018 в 22:37
поделиться
Другие вопросы по тегам:

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