Поиск по блогу

суббота, 3 января 2015 г.

Cтроковыe и встроенные функций Python. Ссылки и примеры для чистки спарсенных фрагментов. Регулярные выражения - ссылки на хороший мануал

После парсинга html-страниц появляется и мусор. Например, как убрать ненужные переносы строк, объединить текстовые фрагменты списков..., сначала надо пробовать "простейших" (быстрые встроенные функции и ...типы...) join(),map(), replace(),str.rstrip()... а уж потом пускаться во все тяжкие с regexp. Поэтому здесь примеры с простейшими и только ссылки для изучения regexp.
Две части пособия с Хабра, два онлайн сервиса отладки, Справочник Python, ходовые примеры от Гугла
Some people, when confronted with a problem, think «I know, I'll use regular expressions.» Now they have two problems.

In [1]:
L = ['L','O','L']
makeitastringdammit = ''.join(map(str, L))
In [2]:
makeitastringdammit
Out[2]:
'LOL'

str.join(iterable) Return a string which is the concatenation of the strings in the iterable iterable. The separator between elements is the string providing this method.

map(function, iterable, ...) Apply function to every item of iterable and return a list of the results. If additional iterable arguments are passed, function must take that many arguments and is applied to the items from all iterables in parallel. If one iterable is shorter than another it is assumed to be extended with None items. If function is None, the identity function is assumed; if there are multiple arguments, map() returns a list consisting of tuples containing the corresponding items from all iterables (a kind of transpose operation). The iterable arguments may be a sequence or any iterable object; the result is always a list.

Если в спискцифры, то их сначала надо перевести в строки:

In [3]:
>>> L1 = [1,2,3]       
>>> " ".join(str(x) for x in L1)
Out[3]:
'1 2 3'
In [6]:
list1 = ['1', '2', '3']
str1 = ''.join(list1)
In [7]:
str1
Out[7]:
'123'

Как убрать пробелы в начале и (только) в конце строки

In [8]:
sspace=" 1234 dddd  "
In [10]:
sspace, sspace.strip(), sspace.rstrip()
Out[10]:
(' 1234 dddd  ', '1234 dddd', ' 1234 dddd')

str.rstrip([chars]) Return a copy of the string with trailing characters removed. The chars argument is a string specifying the set of characters to be removed. If omitted or None, the chars argument defaults to removing whitespace. The chars argument is not a suffix; rather, all combinations of its values are stripped:

will remove all the leading and trailing whitespace characters such as \n, \r, \t, \f, space.

Как убрать любые символы в начале и конце строки

strip is not limited to whitespace characters either:

In [38]:
# remove all leading/trailing commas, periods and hyphens
',,,-wo... - woow   \n---,'.strip(',.-')
Out[38]:
'wo... - woow   \n'
In [41]:
',,,-wo... - woow   \n---,'.strip(',.-').strip()
Out[41]:
'wo... - woow'
In [19]:
 'mississippi'.rstrip('ipz')
Out[19]:
'mississ'
In [42]:
myphrases = [ " Hello ", " Hello", "Hello ", "Bob has a cat" ]

for phrase in myphrases:
    print phrase.strip()
Hello
Hello
Hello
Bob has a cat

In [34]:
'          Hello        \n'.strip()  # ALL spaces at ends removed
Out[34]:
'Hello'
In [30]:
#If you need only to remove one space however, you could do it with:

def strip_one_space(s):
    if s.endswith(" "): s = s[:-1]
    if s.startswith(" "): s = s[1:]
    return s
In [31]:
strip_one_space("   Hello ")
Out[31]:
'  Hello'

Also, note that str.strip() removes other whitespace characters as well (e.g. tabs and newlines). To remove only spaces, you can specify the character to remove as an argument to strip, i.e.:

In [32]:
"  Hello\n".strip(" ")
Out[32]:
'Hello\n'

Убрать перенос строки в списке removing-unwanted /n

readlines returns an iterator, not a list, and you can therefore not use index to get an element. Iterate over the iterator with i.e. a list comprehension and it works.

In [22]:
f=['Kiruna\n', 'setaim=0\n', '23\n', '34\n', '20\n', '1\n', '1\n', '20\n']
In [23]:
content = [x.rstrip() for x in f]
In [24]:
content
Out[24]:
['Kiruna', 'setaim=0', '23', '34', '20', '1', '1', '20']

Замена подстроки в строке

string.replace(s, old, new[, maxreplace]) Return a copy of string s with all occurrences of substring old replaced by new. If the optional argument maxreplace is given, the first maxreplace occurrences are replaced.

In [54]:
" 1234 dddd  ".replace('d','',1) # only 1 replace
Out[54]:
' 1234 ddd  '

str.translate(table[, deletechars]) Return a copy of the string where all characters occurring in the optional argument deletechars are removed, and the remaining characters have been mapped through the given translation table, which must be a string of length 256.

You can use the maketrans() helper function in the string module to create a translation table. For string objects, set the table argument to None for translations that only delete characters:

In [18]:
'read this short text'.translate(None, 'aeiou')
Out[18]:
'rd ths shrt txt'
In [15]:
>>> s = "asjo,fdjk;djaso,oio!kod.kjods;dkps"
>>> s.translate(None, ",!.;")
#'asjofdjkdjasooiokodkjodsdkps'
Out[15]:
'asjofdjkdjasooiokodkjodsdkps'

Как преобразовать строку в список

Есть даже возможности получить список (итератор) слов... из строки

Пример с BMW

Это пример из жизни. Во второй части "пособия для новичков" я случайно прочитал, что лучше использовать встроенные функции... ВМЕСТО регулярных выражений.

In [51]:
bmw=["\n  BMW 3\n седан\n ","3/f30_31/sedan/index.html","1,398,000\n\r"]
In [52]:
[car.rstrip() for car in bmw]
Out[52]:
['\n  BMW 3\n \xd1\x81\xd0\xb5\xd0\xb4\xd0\xb0\xd0\xbd',
 '3/f30_31/sedan/index.html',
 '1,398,000']
In [59]:
[car.replace('\n','').replace(',','').strip() for car in bmw]
Out[59]:
['BMW 3 \xd1\x81\xd0\xb5\xd0\xb4\xd0\xb0\xd0\xbd',
 '3/f30_31/sedan/index.html',
 '1398000']
In [43]:
stripper = str.strip
>>> map(stripper, "QVOD, Baidu Player".split(","))
#['QVOD', 'Baidu Player']
Out[43]:
['QVOD', 'Baidu Player']
In [45]:
dir(str)
Out[45]:
['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__getnewargs__',
 '__getslice__',
 '__gt__',
 '__hash__',
 '__init__',
 '__le__',
 '__len__',
 '__lt__',
 '__mod__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rmod__',
 '__rmul__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '_formatter_field_name_split',
 '_formatter_parser',
 'capitalize',
 'center',
 'count',
 'decode',
 'encode',
 'endswith',
 'expandtabs',
 'find',
 'format',
 'index',
 'isalnum',
 'isalpha',
 'isdigit',
 'islower',
 'isspace',
 'istitle',
 'isupper',
 'join',
 'ljust',
 'lower',
 'lstrip',
 'partition',
 'replace',
 'rfind',
 'rindex',
 'rjust',
 'rpartition',
 'rsplit',
 'rstrip',
 'split',
 'splitlines',
 'startswith',
 'strip',
 'swapcase',
 'title',
 'translate',
 'upper',
 'zfill']
In [46]:
help(str.splitlines)
Help on method_descriptor:

splitlines(...)
    S.splitlines(keepends=False) -> list of strings
    
    Return a list of the lines in S, breaking at line boundaries.
    Line breaks are not included in the resulting list unless keepends
    is given and true.


Note urllib also exposes certain utility functions like splittype, splithost and others parsing url into various components. But it is recommended to use urlparse for parsing urls than using these functions directly. Python 3 does not expose these helper functions from urllib.parse module.



Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий