首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >正则表达式python索引:count

正则表达式python索引:count
EN

Stack Overflow用户
提问于 2018-06-02 03:01:51
回答 3查看 101关注 0票数 0

我有字符串形式的值列表" index : count“,我想提取索引并在字符串中计数,如下面的代码所示:

代码语言:javascript
复制
          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‘

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-02 03:28:26

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

编辑注意:我在以前的编辑中介绍的模式.+:.+是一个错误的,甚至是一个糟糕的正则表达式模式,无法捕获所需的模式。请改用\d+:\d+模式。但是,我还是保留它,因为它仍然可以使用另一个变通方法来解决OP的问题。

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

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

如果使用.+:.+模式,它会将字符串作为一个整体返回,因为它将字符串作为一个整体进行匹配。您需要对结果进行预处理,因为re.findall会返回一个list,在本例中,它只返回一个元素。

代码语言:javascript
复制
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()很好地打印出来。

代码语言:javascript
复制
In [  ]: print(values.pop().split())
['358:6', '1260:2', '1533:7', '1548:292', '1550:48', '1561:3', '1564:186']

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

代码语言:javascript
复制
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很好地打印结果。免责声明:我并不拥有该网站,我只是发现它对初学者很有用:)

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2018-06-02 03:13:41

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

代码语言:javascript
复制
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])

输出:

代码语言:javascript
复制
 358 6
1260 2
1533 7
1548 292
1550 48
1561 3

您可以在字典中方便地使用键/值对(都是字符串)。你会因此而失去你的排序,但是对于键/值来说这应该不是问题。

如果您需要这种排序,只需使用findall的返回列表:

代码语言:javascript
复制
values = re.findall('(\d+):(\d+) ?', s) # use capturing groups

它为您提供了一个元组列表,其中返回了匹配项:

代码语言:javascript
复制
[('358', '6'), ('1260', '2'), ('1533', '7'), ('1548', '292'),
 ('1550', '48'), ('1561', '3'), ('1564', '186')]
票数 3
EN

Stack Overflow用户

发布于 2018-06-02 03:04:27

您正在尝试将string和int连接起来。

替换

代码语言:javascript
复制
print(int(index)+" "+str(count))

使用

代码语言:javascript
复制
print(str(index)+" "+str(count))

您还可以简化代码。

Ex:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50649640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档