正则表达式 python index:count

regular expression python index:count

我有值列表作为字符串"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: invalid literal for int() with base 10: '2 1550'

看来我把正则表达式的操作写错了。知道如何解决这个问题吗?

您正在尝试连接字符串和整数。

替换

print(int(index)+" "+str(count))

print(str(index)+" "+str(count))

您还可以简化代码。

例如:

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)

您已经在使用正则表达式 - 为什么不简单地使用分组并从中创建字典?

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

您可以方便地将 key/value 对放在字典中(全部为字符串)。 你失去了你的顺序,但对于 key/values 应该没问题。

如果需要这种排序,使用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 的问题。

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

这里有很好的链接 regexr and regex101 可以更好地 design/visualize 您的正则表达式模式。

如果您使用 .+:.+ 模式,它将 return 将整个字符串作为一个整体匹配,因为它与整个字符串相匹配。您需要对结果进行预处理,因为 re.findall return 是一个 list,在此示例中,它 return 只有 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']

由于它 return 是一个只有一个元素的列表,您可以使用 pop() to take the only str element out and print it nicely with str function split()

In [  ]: print(values.pop().split())
['358:6', '1260:2', '1533:7', '1548:292', '1550:48', '1561:3', '1564:186']

如果您使用 \d+:\d+ 模式,它会直接 return 您一个很好地分隔的列表,因为它正确地找到了它们。因此,你可以直接打印它的值。

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