代码之家  ›  专栏  ›  技术社区  ›  Bruce

Python:如何从字符串中提取所需的信息?

  •  0
  • Bruce  · 技术社区  · 15 年前

    我有以下输入字符串

    data = '123:Palo Alto, CA -> 456:Seattle, WA 789'
    

    name_list = []
    while i < len(data)):
          if line[i] == ':':
              name = ''
              j = 0
              i = i + 1
              while line[i] != '-' and line[i].isnumeric() == False:
                 name[j] = line[i]   # This line gives error
                 i = i + 1
                 j = j + 1
              name_list.append(name)
          i = i + 1
    

    我该怎么办?

    5 回复  |  直到 15 年前
        1
  •  3
  •   eldarerathis sreeji    15 年前

    假设字符串总是按照您的示例格式化:

    import re
    
    data = '123:Palo Alto, CA -> 456:Seattle, WA 789'
    
    name_list = []
    r = re.compile("(\s?\d)|:")
    name_list += r.sub("", data).split(" ->")
    print name_list # Prints ['Palo Alto, CA', 'Seattle, WA']
    

    >>> s = ""
    >>> len(s)
    0
    

    但是,可以将Python中的字符串与 +

    >>> s += "Some"
    >>> s += " Text"
    >>> print s
    Some Text
    
        2
  •  8
  •   Nick T twasbrillig    15 年前
    data = '123:Palo Alto, CA -> 456:Seattle, WA 789'
    citys = []
    for record in data.split("->"):
        citys.append(
            re.search(r":(?P<city>[\w\s]+),\s*(?P<state>[\w]+)",record)
            .groupdict()
        )
    
    print citys
    

    给予:

    [{'city': 'Palo Alto', 'state': 'CA'}, {'city': 'Seattle', 'state': 'WA'}]

        3
  •  1
  •   dave    15 年前

    假设您总是将字符串格式化为如下所示,您可以执行以下操作:

    cityState = []
    for line in data.split('->'):
        cityState.append({'city':city=line.strip().split(',')[0].split(':')[1],
                         'state':state=line.strip().split(',').split(' ')[1]})
    
        4
  •  1
  •   Pat    15 年前

    如果需要,可以始终使用正则表达式: /\d+:(\w+),\s(\w+)/ . 虽然不漂亮,但应该能完成任务。假设要匹配的字符串是您拥有的测试字符串。

    import re
    
    for s in string_to_match.split("->"):
        m = re.match(r"\d+:(\w+),\s(\w+)", s)
        city = m.group(1)
        state = m.group(2)
    

    语法可能有点错误,但总的想法是存在的。

        5
  •  1
  •   bwawok    15 年前

    inputStr = '123:Palo Alto, CA -> 456:Seattle, WA 789';
    m = re.search('.*:(.*),(.*)->.*:(.*),\s*(\S{2})', inputStr)
    print "City1=" + m.group(1)
    print "State1=" + m.group(2)
    print "City2=" + m.group(3)
    print "State2=" + m.group(4)   
    

    生产

    City1=Palo Alto
    State1= CA 
    City2=Seattle
    State2=WA