Python: проблема при обработке строки - PullRequest
1 голос
/ 24 июня 2010

У меня есть следующая строка:

names = "name:fred, name:wilma, name:barney, name2:gauss, name2:riemann"

Допустим, имена строк имеют атрибуты name и name2.

Как мне написать функцию is_name_attribute (), которая проверяет, еслизначение является атрибутом имени?То есть is_name_attribute ('fred') должен возвращать True, тогда как is_name_attribute ('gauss') должен возвращать False.

Кроме того, как создать строку с разделителями-запятыми, состоящую только из атрибутов имени, т.е.

"fred, wilma, barney" 

Ответы [ 4 ]

5 голосов
/ 24 июня 2010

Примерно так:

>>> names = "name:fred, name:wilma, name:barney, name2:gauss, name2:riemann"
>>> pairs = [x.split(':') for x in names.split(", ")]
>>> attrs = [x[1] for x in pairs if x[0]=='name']
>>> attrs 
['fred', 'wilma', 'barney']
>>> def is_name_attribute(x):
...     return x in attrs
...
>>> is_name_attribute('fred')
True
>>> is_name_attribute('gauss')
False
0 голосов
/ 24 июня 2010

Простое соответствие регулярному выражению:

>>> names = re.compile ('name:([^,]+)', 'g')
>>> names2 = re.compile ('name2:([^,]+)', 'g')
>>> str = "name:fred, name:wilma, name:barney, name2:gauss, name2:riemann"
>>> 'fred' in names.findall(str)
True
>>> names.findall(str)
['fred', 'wilma', 'barney']
0 голосов
/ 24 июня 2010

Есть и другие способы сделать это (как вы увидите из ответов), но, возможно, пришло время изучить магию списка Python.Если вы ищете определенное имя:

for pair in names_list:
    if pair[0] == 'name' and pair[1] == 'fred':
        return true
return false

И объединяете только названия версий:

>>> new_name_list = ','.join([pair[1] for pair in names_list if pair[0] == 'name'])
>>> new_name_list
'fred,wilma,barney'
0 голосов
/ 24 июня 2010

Я думаю, что писать все эти вещи в строке не лучшее решение, но:

import re

names = "name:fred, name:wilma, name:barney, name2:gauss, name2:riemann"

def is_name_attribute(names, name):
    list = names.split()
    compiler = re.compile('^name:(.*)$')
    for line in list:
        line = line.replace(',','')
        match = compiler.match(line)
        if match:
            if name == match.group(1):
                return True
    return False

def commaseperated(names):
    list = names.split()
    compiler = re.compile('^name:(.*)$')
    commasep = ""
    for line in list:
        line = line.replace(',','')
        match = compiler.match(line)
        if match:
            commasep += match.group(1) + ', '
    return commasep[:-2]

print is_name_attribute(names, 'fred')
print is_name_attribute(names, 'gauss')
print commaseperated(names)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...