我正在尝试使用python中的regex解析一个长字符串。 字符串是这样的:
Output = "Name:AmelieAge:30Nationality:english"
基本上,字段名称是固定的但我可以有一个更复杂的字符串和重复数据,例如:
Output = "Name:AmelieAge:30Nationality:englishName:NikeAge:20Nationality:frenshName:davidAge:50Nationality:Irish"
我正在寻找一种方法来获得这样的结构化数据:
Name:Amelie
Age:30
Nationality:english
Name:David
Age:50
Nationality:Irish
如果您有任何关于使用正则表达式的建议,以便解析这个长字符串。
仅供参考:字符串大小是随意的
答案 0 :(得分:2)
尝试:
>>> re.findall("[A-Z][a-z]+\:[\w\d][a-z\d]+", Output)
['Name:Amelie', 'Age:30', 'Nationality:english']
我认为所有的键都以大写字母开头,而且除了第一个键之外,Values没有大写字母。
答案 1 :(得分:1)
re.findall("[A-Z]\w+:[\d\w]+(?=[A-Z]\w+|$)", Output)
使用先行断言是最好的方法。这个正则表达式将捕获以大写字母开头并以大写字母开头的字符串,然后继续:
,之后它将捕获任何数字或字母,直到留下以字母开头的字符组并继续字母或直到到达文本的末尾。
这将正确捕捉群体,即使在@ bigOTHER的评论中也是如此。
答案 2 :(得分:0)
您可以从字符串中创建一个字典列表:
import re, itertools
Output = "Name:AmelieAge:30Nationality:englishName:NikeAge:20Nationality:frenshName:davidAge:50Nationality:Irish"
entries = []
i_split = iter(re.split("(Name|Nationality|Age):", Output)[1:])
for entry in iter(lambda: list(itertools.islice(i_split, 6)), []):
i_entry = iter(entry)
d_entry = {k:next(i_entry) for k in i_entry}
entries.append(d_entry)
# Display the whole list
print entries
print
# Display entries one at a time
for entry in entries:
for k, v in entry.items():
print "{}:{}".format(k,v)
print
这会给你输出:
[{'Nationality': 'english', 'Age': '30', 'Name': 'Amelie'}, {'Nationality': 'frensh', 'Age': '20', 'Name': 'Nike'}, {'Nationality': 'Irish', 'Age': '50', 'Name': 'david'}]
Nationality:english
Age:30
Name:Amelie
Nationality:frensh
Age:20
Name:Nike
Nationality:Irish
Age:50
Name:david