Поиск явного слова в списке с помощью Python

python csv parsing

126 просмотра

4 ответа

372 Репутация автора

У меня есть CSV-файл в формате ключ-значение (ID, тег), содержащий следующее:

1, искусство

2, изобразительное искусство, шедевр

3, современное искусство

4, артефакт; артефакт

5, статья

Моя цель - использовать python, чтобы возвращать только идентификаторы 1, 2 и 3, которые являются тегами со словом «art» в них. Когда я использую функцию find () (myfile.find ("art")), она находит идентификаторы 1-5.

Моей первой мыслью было посмотреть на символы вокруг строки «art» в тегах. Возможно, я мог бы использовать функцию isalpha (), чтобы спросить, действительно ли символ до и после строки «art» является буквами, а не пунктуацией. Тем не менее, это один из первых сценариев Python, которые я написал, поэтому вполне может быть REGEX, который делает это в одной строке, о которой я не знаю.

Любая помощь будет принята с благодарностью.

Автор: Mink Источник Размещён: 18.07.2016 11:52

Ответы (4)


2 плюса

93435 Репутация автора

Решение

Вы можете использовать регулярное выражение с \bутверждением:

>>> import re
>>> pairs = ((1, "art"), (2, "fine art;masterpiece"), (3, "modern art"),
             (4, "artifact;artefact"), (5, "article"))
>>> [id for id, tag in pairs if re.search(r"\bart\b", tag)]
[1, 2, 3]

Как объясняется в документации, \bсоответствует границе между словом и словом (и наоборот) или между словом и началом / концом строки.

Автор: Eugene Yarmash Размещён: 18.07.2016 12:27

0 плюса

1025 Репутация автора

Вы можете использовать этот код:

lines = ['art', 'fine art;masterpiece', 'modern art', 'artifact;artefact', 'article']
for l in lines:
    lis = [_.split(' ') for _ in l.split(';')] # Split the values.
    lis = [item for sublist in lis for item in sublist] # Flatten the list.
    print 'art' in lis # Check if 'art' is contained.

Это позволяет вам определить линии, в которых содержится искусство (а не артефакт). Или вот так:

lines = ['art', 'fine art;masterpiece', 'modern art', 'artifact;artefact', 'article']
idx = 1
for l in lines:
    lis = [_.split(' ') for _ in l.split(';')] # Split the values.
    lis = [item for sublist in lis for item in sublist] # Flatten the list.
    if 'art' in lis: # Check if 'art' is contained.
        print idx
    idx = idx + 1
Автор: Ohumeronen Размещён: 18.07.2016 12:31

1 плюс

96 Репутация автора

Вам нужно создать поисковый индекс, который реализует вашу логику индексации. Прочитайте ваш файл, проанализируйте каждую строку CSV и обновите индекс поиска на основе, dictнапример. Каждый элемент в индексе поиска должен быть нормализован, например строчными буквами, и указывать на список идентификаторов.

Вот небольшой фрагмент:

from StringIO import StringIO

file_content = StringIO('''1,art
2,fine art;masterpiece
3,modern art
4,artifact;artefact
5,article''')

_index = {}

for line in file_content:
    # parse CSV
    (_id, _, tags) = line.strip().partition(',')


    # parse tags
    tags = tags.split(';')

    tokens = set([])

    # tokenize tags
    for tag in tags:
        for token in tag.split(' '):
            # add normalized token to tokens set
            tokens.add(token.lower())

    # update index
    for token in tokens:
        if token in _index:
            _index[token].append(_id)
        else:
            _index[token] = [_id]

# lookup tag arg in your index
print _index['art']

>>> ['1', '2', '3']
Автор: Simon Pirschel Размещён: 18.07.2016 12:39

0 плюса

4611 Репутация автора

Simple and Sweet: используйте \ b - границы слов

a = ['1,art','2,fine art;masterpiece','3,modern art','4,artifact,artefact','5,article']
for data in a:
    output = re.search(r'\bart\b',data)
    if 'art' in str(output):
       ids = re.findall('\d+', data)
       print(ids)
Автор: akash karothiya Размещён: 18.07.2016 12:56
Вопросы из категории :
32x32