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

时间:2014-09-02 16:46:29

标签: python regex

您好我是python和regex的新手。 我有一个大型CSV文件,其中包含%age composition等字段,其中包含以下值:

'34% passed 23% failed 46% deferred'

如何拆分此字符串以便获取字典对象:

每行

{'passed': 34, 'failed': 23, 'deferred': 46}

我试过了:

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

但这只取%年龄值

3 个答案:

答案 0 :(得分:5)

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

(\w+)%\s(\w+)

哪个匹配一个或多个字母数字字符(替代:[0-9a-zA-Z_]+)后跟%符号,空格字符和一个或多个字母数字字符。括号帮助capturing适当的字符集。

演示:

>>> 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'}

答案 1 :(得分:3)

您不需要使用正则表达式:

>>> 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)来自grouper - itertools recipes(另见How does zip(*[iter(s)]*n) work in Python?):

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

答案 2 :(得分:0)

试试这个:

[编辑:添加了对基于OP请求检查的单词的列表支持。还清除了alecx在此处使用的字典构建代码:https://stackoverflow.com/a/25628562/3646530]

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

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

为了构建字符串'传递|失败| ..'我使用字符串的.join函数来连接checkList中的单词,并将竖线字符作为分隔符。