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

3 投票
5 回答
29281 浏览
提问于 2025-04-16 03:05

我刚开始学习Python。请问Python里有没有类似于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

我该怎么做呢?

5 个回答

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)

语法可能有点问题,但大体思路是对的。

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

输出结果是:

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

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

撰写回答