我是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
我该怎么办?
答案 0 :(得分: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'}]
答案 1 :(得分: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
答案 2 :(得分:1)
假设您始终使用如下所示格式化的字符串:
cityState = []
for line in data.split('->'):
cityState.append({'city':city=line.strip().split(',')[0].split(':')[1],
'state':state=line.strip().split(',').split(' ')[1]})
答案 3 :(得分:1)
如果需要,您可以随时使用正则表达式:/\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)
语法可能有些偏差,但一般的想法就在那里。
答案 4 :(得分: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