正则表达式python索引:count
我有一个字符串“index: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(":")]
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('(.+?):(。