我有字符串形式的值列表" index : count“,我想提取索引并在字符串中计数,如下面的代码所示:
string="358:6 1260:2 1533:7 1548:292 1550:48 1561:3 1564:186"
values=[v for v in re.findall('.+?:.+?.', string)]
for g in values:
index=g[:g.index(":")]
count=g[g.index(":")+1:]
print(int(index)+" "+str(count))
但我收到了错误消息
ValueError:基数为10的int()的文本无效:'2 1550‘
似乎我写错了正则表达式操作。你知道怎么解决这个问题吗?
发布于 2018-06-02 03:28:26
我认为您不需要在正则表达式模式的末尾使用?
延迟修饰符。您放在那里的?
惰性修饰符实际上会比捕获正确的数据产生更多的噪声
编辑注意:我在以前的编辑中介绍的模式.+:.+
是一个错误的,甚至是一个糟糕的正则表达式模式,无法捕获所需的模式。请改用\d+:\d+
模式。但是,我还是保留它,因为它仍然可以使用另一个变通方法来解决OP的问题。
只要您的数据没有格式错误或不包含噪声,并且用空格整齐地分隔,我认为'.+:.+'
就足以找到您的index:count
格式。也许最好的方法是使用\d+:\d+
,因为您知道它至少是一个由:
分隔的digit
,后面跟着另一个digit
。
这里有很好的链接regexr和regex101,它们可以更好地设计/可视化您的正则表达式模式。
如果使用.+:.+
模式,它会将字符串作为一个整体返回,因为它将字符串作为一个整体进行匹配。您需要对结果进行预处理,因为re.findall
会返回一个list
,在本例中,它只返回一个元素。
In [ ]: string="358:6 1260:2 1533:7 1548:292 1550:48 1561:3 1564:186"
...: values=[v for v in re.findall('.+:.+', string)]
...: print(values)
['358:6 1260:2 1533:7 1548:292 1550:48 1561:3 1564:186']
因为它返回一个只有一个元素的列表,所以可以使用pop()
取出唯一的str
元素,并使用str
函数split()
很好地打印出来。
In [ ]: print(values.pop().split())
['358:6', '1260:2', '1533:7', '1548:292', '1550:48', '1561:3', '1564:186']
如果你使用的是\d+:\d+
模式,它会直接返回一个分隔良好的列表,因为它会正确地找到它们。因此,您可以直接打印它的值。
In [ ]: string="358:6 1260:2 1533:7 1548:292 1550:48 1561:3 1564:186"
...: values=[v for v in re.findall('\d+:\d+', string)]
...: print(values)
['358:6', '1260:2', '1533:7', '1548:292', '1550:48', '1561:3', '1564:186']
最后,您可以使用内置的string formatting很好地打印结果。免责声明:我并不拥有该网站,我只是发现它对初学者很有用:)
In [ ]: for s in values:
...: index, count = s.split(":")
...: print("Index: {:>8} Count: {:>8}".format(index, count))
...:
Index: 358 Count: 6
Index: 1260 Count: 2
Index: 1533 Count: 7
Index: 1548 Count: 292
Index: 1550 Count: 48
Index: 1561 Count: 3
Index: 1564 Count: 186
发布于 2018-06-02 03:13:41
你已经在使用正则表达式了--为什么不简单地使用分组并从中创建一个字典呢?
import re
s="358:6 1260:2 1533:7 1548:292 1550:48 1561:3 1564:186"
values= dict(re.findall('(\d+):(\d+) ?', s)) # use capturing groups
for g in values:
print(g, values[g])
输出:
358 6
1260 2
1533 7
1548 292
1550 48
1561 3
您可以在字典中方便地使用键/值对(都是字符串)。你会因此而失去你的排序,但是对于键/值来说这应该不是问题。
如果您需要这种排序,只需使用findall的返回列表:
values = re.findall('(\d+):(\d+) ?', s) # use capturing groups
它为您提供了一个元组列表,其中返回了匹配项:
[('358', '6'), ('1260', '2'), ('1533', '7'), ('1548', '292'),
('1550', '48'), ('1561', '3'), ('1564', '186')]
发布于 2018-06-02 03:04:27
您正在尝试将string和int连接起来。
替换
print(int(index)+" "+str(count))
使用
print(str(index)+" "+str(count))
您还可以简化代码。
Ex:
import re
string="358:6 1260:2 1533:7 1548:292 1550:48 1561:3 1564:186"
values=[v for v in re.findall('.+?:.+?.', string)]
for g in values:
index, count =g.split(":")
print(index, count)
https://stackoverflow.com/questions/50649640
复制相似问题