English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Советы по обработке строк в Python

Как разделить строку с несколькими разделителями?

Реальный случай

Мы должны разделить строку на различные фрагменты в зависимости от разделителя, строка содержит различные разделители, например:

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"

Основной учебник
Рекомендуется