English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Как разделить строку с несколькими разделителями?
Реальный случай
Мы должны разделить строку на различные фрагменты в зависимости от разделителя, строка содержит различные разделители, например:
s = 'asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd'
Где <,>, <;>, <|>, <\t> являются разделителями, как обрабатывать?
Решение
Использование метода split() несколько раз, чтобы обработать каждый разделитель
# Использование Python2 def mySplit(s,ds): res = [s] for d in ds: t = [] map(lambda x: t.extend(x.split(d)), res) res = t return [x for x in res if x] s = 'asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd' result = mySplit(s, ';,|\t') print(result)
C:\Users\Administrator>C:\Python\Python27\python.exe E:\python-intensive-training\s2.py ['asd', 'aad', 'dasd', 'dasd', 'sdasd', 'asd', 'Adas', 'sdasd', 'Asdasd', 'd', 'asd']
Использование метода re.split() регулярного выражения для一次性 разделения строки
>>> import re >>> re.split('[,;\t|]+','asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd') ['asd', 'aad', 'dasd', 'dasd', 'sdasd', 'asd', 'Adas', 'sdasd', 'Asdasd', 'd', 'asd']
Второй вопрос: как определить, начинается ли строка a с строки b или заканчивается на нее?
Реальный случай
Если в каталоге есть такие файлы:
quicksort.c graph.py heap.java install.sh stack.cpp ......
Теперь нужно предоставить права выполнения для папок с расширением .sh и .py
Решение
Использование методов startswith() и endswith() для строк
>>> import os, stat >>> os.listdir('./') ['heap.java', 'quicksort.c', 'stack.cpp', 'install.sh', 'graph.py'] >>> [name for name in os.listdir('./') if name.endswith(('.sh','.py'))] ['install.sh', 'graph.py'] >>> os.chmod('install.sh', os.stat('install.sh').st_mode | stat.S_IXUSR)
[root@iZ28i253je0Z t]# ls -l install.sh -rwxr--r-- 1 root root 0 Sep 15 18:13 install.sh
Третий вопрос: как отформатировать текст в строке?
Реальный случай
Журнальный файл определенного программного обеспечения, в котором формат даты представлен как yyyy-mm-dd:
2016-09-15 18:27:26 statu unpacked python3-pip:all 2016-09-15 19:27:26 statu half-configured python3-pip:all 2016-09-15 20:27:26 statu installd python3-pip:all 2016-09-15 21:27:26 configure asdasdasdas:all python3-pip:all
Нужно изменить формат даты на формат США dd/mm/yyyy, 2016-09-15 --> 09/15/2016, как это сделать?
Решение
Использование метода re.sub() регулярного выражения для замены строк
Используя группы захвата регулярного выражения, захватываем каждый раздел и устанавливаем порядок各组 в заменяемой строке.
>>> log = '2016-09-15 18:27:26 statu unpacked python3-pip:all' >>> import re # По порядку >>> re.sub('(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1' , log) '09/15/2016 18:27:26 statu unpacked python3-pip:all' # Использование групп захвата регулярного выражения >>> re.sub('(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})', r'\g<month>/\g<day>/\g<year>' , log) '09/15/2016 18:27:26 statu unpacked python3-pip:all'
Четыре, как объединить несколько маленьких строк в одну большую?
Реальный случай
При разработке определенной сетевой программы мы создали пользовательский сетевой протокол на основе UDP, передающий в固定 порядке серию параметров на сервер:
hwDetect: "<0112>" gxDepthBits: "<32>" gxResolution: "<1024x768>" gxRefresh: "<60>" fullAlpha: "<1>" lodDist: "<100.0>" DistCull: "<500.0>"
В программе мы собираем все параметры по порядку в список:
["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]
В конечном итоге нам нужно объединить все параметры в один пакет данных для отправки:
"<0112><32><1024x768><60><1><100.0><500.0>"
Решение
Итеративный список, последовательно использовать оператор '+' для объединения каждого строки
>>> для n в ["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]: ... result += n ... >>> result '<0112><32><1024x768><60><1><100.0><500.0>'
Использование метода str.join() позволяет более быстро скомбинировать все строки в списке
>>> result = ''.join(["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]) >>> result '<0112><32><1024x768><60><1><100.0><500.0>'
Если в списке есть числа, можно использовать генератор для их преобразования:
>>> hello = [222,'sd',232,'2e',0.2] >>> ''.join(str(x) for x in hello) '222sd2322e0.2'
Как выровнять строку по левому, правому и центральному краям?
Реальный случай
В каком-то словаре хранится ряд значений свойств:
{ 'ip':'127.0.0.1', 'blog': 'www.anshengme.com', 'title': 'Hello world', 'port': '80' }
В программе, мы хотим вывести содержимое в следующем формате, как это сделать?
ip : 127.0.0.1 blog : www.anshengme.com title : Hello world port : 80
Решение
Использование str.ljust() , str.rjust, str.center() для выравнивания по левому, правому и центральному краям
>>> info = {'ip':'127.0.0.1','blog': 'www.anshengme.com','title': 'Hello world','port': '80'} # Получение ключей максимальной длины из словаря >>> max(map(len, info.keys())) 5 >>> w = max(map(len, info.keys())) >>> for k in info: ... print(k.ljust(w), ':',info[k]) ... # Полученные результаты port : 80 blog : www.anshengme.com ip : 127.0.0.1 title : Hello world
Использование метода format(), передача параметров '<20','>20','^20' для выполнения одной и той же задачи
>>> for k in info: ... print(format(k,'^'+str(w)), ':',info[k]) ... port : 80 blog : www.anshengme.com ip : 127.0.0.1 title : Hello world
Шестой вопрос: как удалить ненужные символы из строки?
Реальный случай
Фильтрация избыточных пробельных символов в вводе пользователя: [email protected]
Фильтрация '\r' в тексте, редактируемом в Windows: hello word\r\n
Удаление из текста unicode-символов (intonаций): ‘ní hǎo, chī fàn'
Решение
Методы strip(), lstrip(), rstrip() строки удаляют символы с обоих концов строки
>>> email = ' [email protected] ' >>> email.strip() '[email protected]' >>> email.lstrip() '[email protected] ' >>> email.rstrip() ' [email protected]' >>>
Удаление символов в фиксированном положении можно выполнить с помощью метода slicing + concatenation
>>> s[:3] + s[4:] 'abc123'
Метод replace() строки или регулярное выражение re.sub() удаляют символы в любом месте
>>> s = '\tabc\t123\txyz' >>> s.replace('\t', '') 'abc123xyz'
Использование re.sub() для удаления нескольких
>>> import re >>> re.sub('[\t\r]','', string) 'abc123xyzopq'
Метод translate() строки может удалять несколько различных символов одновременно
>>> import string >>> s = 'abc123xyz' >>> s.translate(string.maketrans('abcxyz','xyzabc')) 'xyz123abc'
>>> s = '\rasd\t23\bAds' >>> s.translate(None, '\r\t\b') 'asd23Ads'
# python2.7 >>> i = u'ní hǎo, chī fàn' >>> i u'ni\u0301 ha\u030co, chi\u0304 fa\u0300n' >>> i.translate(dict.fromkeys([0x0301, 0x030c, 0x0304, 0x0300])) u'ni hao, chi fan'
Обобщение
Вот собранные нами советы по обработке строк в Python, в статье показаны примеры, решения и примеры, которые могут быть полезны для обучения или использования python. Если нужно, можно использовать для参考.
Более подробную информацию о Python можно найти в разделе сайта: "Сборник советов по работе с строками Python", "Обзор技巧 по кодированию Python", "Сборник советов по работе с изображениями Python", "Учебник по структурам данных и алгоритмам Python", "Сборник советов по Socket-программированию Python", "Сборник советов по использованию функций Python", "Классические курсы по入门у и продвинутому изучению Python" и "Сборник советов по работе с файлами и директориями Python"