data = ['ID:123 GE:m FN:Amir LN:Maleki MN:0400101010 EM:a@b.c ST:VIC',
' ID:b22 EM:b@d.c ST:VIC GE:F FN:Miniyi LN:Li MN:0430101210 MN:0432101215',
' ID:153 GE:m FN:John LN:Liu MN:040181010 ST:NSW EM:d@b.c']
我想知道如何计算只包含数字的ID数量。我是否需要将此列表转换为字典才能这样做,还是有更简单的方法?
感谢
答案 0 :(得分:1)
正则表达式对我来说太过分了。以下是基于split
的解决方案:
>>> data = ['ID:123 GE:m FN:Amir LN:Maleki MN:0400101010 EM:a@b.c ST:VIC',
... ' ID:b22 EM:b@d.c ST:VIC GE:F FN:Miniyi LN:Li MN:0430101210 MN:0432101215',
... ' ID:153 GE:m FN:John LN:Liu MN:040181010 ST:NSW EM:d@b.c']
>>>
>>> data_split = [[i.split(':') for i in s.split()] for s in data]
>>> IDs = [v for s in data_split for k, v in s if k=='ID']
>>> sum(map(str.isdigit, IDs))
2
答案 1 :(得分:0)
每当您尝试查找某些内容的实例数时,您的基线就是使用正则表达式或正则表达式。
对于您的特定示例,您似乎可以使用正则表达式id:\d\d\d
re.findall
会为您提供所有比赛
并len(re.findall)
将为您提供匹配数
我遗漏了一个全面的解决方案,所以你可以尝试自己。正则表达式对于所有语言的模式匹配都很有用。如果您熟悉某些库或方法,可能会有更快/更简单的方法,但正则表达式始终是模式匹配的绝对方式。
答案 2 :(得分:0)
您可以使用正则表达式,例如,正则表达式\bID:\d+\b
将匹配ID字段,后跟仅数字值,直到下一个字边界\b
。只需过滤那些与正则表达式匹配的内容。
>>> [d for d in data if re.search(r"\bID:\d+\b", d)]
['ID:123 GE:m FN:Amir LN:Maleki MN:0400101010 EM:a@b.c ST:VIC',
' ID:153 GE:m FN:John LN:Liu MN:040181010 ST:NSW EM:d@b.c']
或者,如果您只想计算,可以使用sum
:
>>> sum(1 for d in data if re.search(r"\bID:\d+\b", d))
2
答案 3 :(得分:0)
如果您只想查看:
data = ['ID:123 GE:m FN:Amir LN:Maleki MN:0400101010 EM:a@b.c ST:VIC',
' ID:b22 EM:b@d.c ST:VIC GE:F FN:Miniyi LN:Li MN:0430101210 MN:0432101215',
' ID:153 GE:m FN:John LN:Liu MN:040181010 ST:NSW EM:d@b.c']
for i in data:
print(i.split()[0].split(':')[1].isdigit())
输出:
True
False
True
如果您也想要这些ID:
print([i for i in data if i.split()[0].split(':')[1].isdigit()])
输出:
['ID:123 GE:m FN:Amir LN:Maleki MN:0400101010 EM:a@b.c ST:VIC', ' ID:153 GE:m FN:John LN:Liu MN:040181010 ST:NSW EM:d@b.c']