在python中拆分%年龄和值的正则表达式

在python中拆分%年龄和值的正则表达式,python,regex,Python,Regex,您好,我是python和正则表达式的新手。 我有一个大型CSV文件,它有一个类似于,%age composition的字段,其中包含以下值: “34%通过23%失败46%延迟” 如何拆分此字符串以获得dictionary对象: {'passed':34',failed':23',deferred':46}对于每一行 我试过这个: for line in csv_lines: for match in re.findall('[\d\s%%]*\s', line) 但这只取了%age值,

您好,我是python和正则表达式的新手。 我有一个大型CSV文件,它有一个类似于,
%age composition
的字段,其中包含以下值:

“34%通过23%失败46%延迟”

如何拆分此字符串以获得dictionary对象:

{'passed':34',failed':23',deferred':46}
对于每一行

我试过这个:

for line in csv_lines:
    for match in re.findall('[\d\s%%]*\s', line)

但这只取了%age值,您不需要使用正则表达式:

>>> s = '34% passed 23% failed 46% deferred'
>>> groups = zip(*[iter(s.split())]*2)
>>> groups
[('34%', 'passed'), ('23%', 'failed'), ('46%', 'deferred')]
>>> {result: int(percent.rstrip('%')) for percent, result in groups}
{'failed': 23, 'passed': 34, 'deferred': 46}

zip(*[iter(…)]*2)
来自(另见):


如果你仍然想使用正则表达式,你可以使用这个:

(\w+)%\s(\w+)
它将匹配一个或多个字母数字字符(可选:
[0-9a-zA-Z!+
),后跟
%
符号、空格字符和一个或多个字母数字字符。括号有助于提供适当的字符集

演示:

试试这个:

[编辑:添加了基于OPs请求检查单词的列表支持。还清除了此处使用的字典生成代码:

这里的正则表达式是\d{1,3}-用于捕获百分比int,并通过| failed |延迟以获取类型。我使用列表理解生成键和值的元组列表,然后将其转换为字典


为了生成字符串“passed | failed |…”,我使用字符串的.join函数将检查表中的单词连接起来,并使用管道字符作为分隔符。

您可以查看此网站,以帮助进行正则表达式构造:。否则,请向我们展示您的尝试,以便我们可以帮助您改进它们,而不仅仅是要求某人为r您可能值得链接到
zip iter
magic的一个链接。@DSM,谢谢您的评论。我相应地更新了答案。您在我之前就得到了:)而且更干净too@Ashwin同样,falsetru让我提供了一种基于正则表达式的方法:)
\w+
可能更好,以防这些只是可能选项的一个示例因此,类似于
result=dict([(k,v)for(v,k)在re.findall('(\d{1,3})%\w+',data)]中
要在%age之后抓取单词吗?还有,您如何将
通过|失败|延迟
链接到一个包含其他值的列表以进行检查?@achoon编辑了我的答案以支持这一点。此外\w+将匹配该答案之后的所有单词。但是为了抓取它,您必须对其进行分组。因此使用(\w+)将其分组并使其可访问。将正则表达式放入如下工具中:可视化您的组并测试您的正则表达式
(\w+)%\s(\w+)
>>> import re
>>> s = '34% passed 23% failed 46% deferred'
>>> pattern = re.compile(r'(\w+)%\s(\w+)')
>>> {value: key for key, value in pattern.findall(s)}
{'failed': '23', 'passed': '34', 'deferred': '46'}
import re

data = """34% passed 23% failed 46% deferred 34% checked"""
checkList = ['passed', 'failed', 'deferred', 'checked']
result = {k:v for (v, k) in re.findall('(\d{1,3})% (' + '|'.join(checkList) + ')', data)}
print(result) # Python 3
#print result # Python 2.7