Python:处理字符串时出现问题

Python:处理字符串时出现问题,python,data-structures,string,Python,Data Structures,String,我有一个字符串,如下所示: names = "name:fred, name:wilma, name:barney, name2:gauss, name2:riemann" 假设字符串名称具有name和name2属性 如何编写一个函数is_name_attribute来检查值是否为name属性?也就是说,is_name_属性'fred'应该返回True,而is_name_属性'gauss'应该返回False 另外,如何创建仅包含名称属性的逗号分隔字符串,即 "fred, wilma, barn

我有一个字符串,如下所示:

names = "name:fred, name:wilma, name:barney, name2:gauss, name2:riemann"
假设字符串名称具有name和name2属性

如何编写一个函数is_name_attribute来检查值是否为name属性?也就是说,is_name_属性'fred'应该返回True,而is_name_属性'gauss'应该返回False

另外,如何创建仅包含名称属性的逗号分隔字符串,即

"fred, wilma, barney" 
大概是这样的:

>>> 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
大概是这样的:

>>> 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

我认为以字符串形式编写这些内容不是最好的解决方案,但是:

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)

我认为以字符串形式编写这些内容不是最好的解决方案,但是:

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)

从答案中可以看出,还有其他方法可以做到这一点,但也许是时候学习一些Python列表魔法了

>>> names = "name:fred, name:wilma, name:barney, name2:gauss, name2:riemann"
>>> names_list = [pair.split(':') for pair in names.split(', ')]
>>> names_list
[['name', 'fred'], ['name', 'wilma'], ['name', 'barney'], ['name2', 'gauss'], ['name2', 'riemann']]
从这里开始,这只是一个检查的例子。如果您正在查找某个名称:

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'

从答案中可以看出,还有其他方法可以做到这一点,但也许是时候学习一些Python列表魔法了

>>> names = "name:fred, name:wilma, name:barney, name2:gauss, name2:riemann"
>>> names_list = [pair.split(':') for pair in names.split(', ')]
>>> names_list
[['name', 'fred'], ['name', 'wilma'], ['name', 'barney'], ['name2', 'gauss'], ['name2', 'riemann']]
从这里开始,这只是一个检查的例子。如果您正在查找某个名称:

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'

简单regexp匹配:

>>> 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']

简单regexp匹配:

>>> 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']

在你的例子中,你的意思是“名字”和“属性”是“高斯”吗?@Constantin:好主意;我已经更新了。你的意思是你的例子中的“名字”属性是“高斯”吗?@Constantin:好主意;我已经更新了。