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

3

我对Python还很陌生,有没有类似于Java中的StringTokenizer的功能?我能否逐个字符扫描和复制?

我有以下输入字符串:

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

我该怎么办?


所有城市都在 : 和 , 之间,这些标点符号不会出现在其他地方吗? - mmmmmm
@Mark:我修改了问题。现在我需要(城市,州)字段。是的,这些标点符号在其他地方都没有出现。 - Bruce
789是一个打字错误还是模式不重复? - Sam Dolan
不,这不是打字错误。它代表一个任意的数字 :) - Bruce
5个回答

8
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

给出:

[{'城市': '帕洛阿尔托', '州': '加利福尼亚'}, {'城市': '西雅图', '州': '华盛顿'}]


3

如果您愿意,您可以使用正则表达式:/\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)

语法可能有点问题,但大致的思路已经表达出来了。

3

我的看法是,假设字符串始终按照您的示例格式进行格式化:

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

作为您错误的注释,空字符串的长度为0,因此索引0不存在:
>>> s = ""
>>> len(s)
0

您可以使用Python的+运算符来连接字符串,例如:
>>> s += "Some"
>>> s += " Text"
>>> print s
Some Text

1
假设您始终拥有如所示的字符串格式,则可以执行以下操作:
cityState = []
for line in data.split('->'):
    cityState.append({'city':city=line.strip().split(',')[0].split(':')[1],
                     'state':state=line.strip().split(',').split(' ')[1]})

1

你可以使用正则表达式。这是我的丑陋的正则表达式,你可以做得更好。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接