【问题标题】:Python: problem processing a stringPython:处理字符串的问题
【发布时间】:2010-06-24 12:51:16
【问题描述】:

我有一个字符串如下:

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" 

【问题讨论】:

  • 您的示例中的意思是“is_name_attribute('gauss')”吗?
  • @Constantin:好电话;我已经更新了。

标签: python data-structures string


【解决方案1】:

类似这样的:

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

【讨论】:

    【解决方案2】:

    还有其他方法可以做到这一点(正如您从答案中看到的那样),但也许是时候学习一些 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'
    

    【讨论】:

      【解决方案3】:

      简单的正则表达式匹配:

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

      【讨论】:

        【解决方案4】:

        我认为在字符串中写这些东西并不是最好的解决方案,但是:

        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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多