正则表达式python索引:count

正则表达式python索引:count,python,regex,python-3.x,regex-greedy,Python,Regex,Python 3.x,Regex Greedy,我有一个字符串“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(":")]

我有一个字符串“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”


看来我把正则表达式操作写错了。你知道怎么解决这个问题吗

您正在尝试连接字符串和int

替换

print(int(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)

您正在尝试连接字符串和int

替换

print(int(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)

您已经在使用正则表达式了——为什么不简单地使用分组并从中创建一个dict呢

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')]

您已经在使用正则表达式了——为什么不简单地使用分组并从中创建一个dict呢

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')]

我认为您不需要在正则表达式模式末尾使用
惰性修饰符。放置在那里的
惰性修改器实际上会产生比捕获正确数据更多的噪声

编辑说明:我在以前的编辑中引入的模式
+:。++
是错误的,甚至是错误的正则表达式模式,用于捕获所需的模式。请改用
\d+:\d+
模式。但是,我还是不使用它,因为它仍然可以使用另一种解决方法来解决OP的问题

只要您的数据没有格式错误或包含杂音,并且用空格整齐地分隔,我认为
.+:.+.
就足以找到您的
索引:count
格式。最好的方法可能是使用
\d+:\d+
,因为您知道它至少是一个
数字,由
分隔,后面跟着另一个
数字

这里有一些很好的链接,可以更好地设计/可视化您的正则表达式模式

如果使用
+:.++
模式,它将返回整个字符串,因为它与整个字符串相匹配。您需要对结果进行预处理,因为它返回一个
列表
,在本例中,它只返回1个元素

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']
由于它只返回一个包含一个元素的列表,因此您可以使用来取出唯一的
str
元素,并使用
str
函数很好地打印它

如果您使用的是
\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']
最后,您可以使用内置的打印机很好地打印结果免责声明:我没有这个网站,我只是觉得它对初学者很有用:)


我认为您不需要在正则表达式模式末尾使用
惰性修饰符。放置在那里的
惰性修改器实际上会产生比捕获正确数据更多的噪声

编辑说明:我在以前的编辑中引入的模式
+:。++
是错误的,甚至是错误的正则表达式模式,用于捕获所需的模式。请改用
\d+:\d+
模式。但是,我还是不使用它,因为它仍然可以使用另一种解决方法来解决OP的问题

只要您的数据没有格式错误或包含杂音,并且用空格整齐地分隔,我认为
.+:.+.
就足以找到您的
索引:count
格式。最好的方法可能是使用
\d+:\d+
,因为您知道它至少是一个
数字,由
分隔,后面跟着另一个
数字

这里有一些很好的链接,可以更好地设计/可视化您的正则表达式模式

如果使用
+:.++
模式,它将返回整个字符串,因为它与整个字符串相匹配。您需要对结果进行预处理,因为它返回一个
列表
,在本例中,它只返回1个元素

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']
由于它只返回一个包含一个元素的列表,因此您可以使用来取出唯一的
str
元素,并使用
str
函数很好地打印它

如果您使用的是
\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']
最后,您可以使用内置的打印机很好地打印结果免责声明:我没有这个网站,我只是觉得它对初学者很有用:)


或者,如果您正在使用更新的python:
print(f{index}{count}”)
如果它只是一个标准的分隔符,
print(index,count)
也可以工作,并避免
str
concat或
f-string
构造。
print([chunk.split(':')for chunk in string.split()])
因为您已经在使用正则表达式,为什么不用它来做分割呢?只需
re.findall('(.+?):(.+?)。,string)
将为您提供(索引,计数)对的列表。问题不在于字符串打印,而在于正则表达式。尝试将正则表达式放入可视化工具(例如regex101.com)中,查看正则表达式实际匹配的内容,或者如果您使用的是更新的python:
print(f{index}{count}”)
如果它只是一个标准分隔符,
print(index,count)
也可以工作并避免
str
concat或
f-string
构造。
print([chunk.split(':')用于string.split()中的chunk]
既然您已经在使用正则表达式,为什么不也使用它来进行拆分呢?只需
re.findall('(.+?):(。