2014-09-02 70 views
0

你好,我是新的python和正則表達式。 我其中有一個領域像一個大的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) 

但這只是拿着%年齡值

+0

你可以看看這個網站來幫助建立正則表達式:http://txt2re.com/。否則,請向我們展示您的嘗試,以便我們可以幫助您改進它們,而不是要求某人爲您做。 – 2014-09-02 16:49:37

回答

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

你在之前做到了:)而且更乾淨 – ashwinjv 2014-09-02 17:04:52

+0

@Ashwin同樣在這裏,我使用了一個基於正則表達式的方法:) – alecxe 2014-09-02 17:06:18

+0

謝謝你,這很棒 – aqoon 2014-09-03 14:37:00

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) 
+0

值得鏈接到'zip-iter'魔術的[解釋](http://stackoverflow.com/questions/2233204/how-does-zipitersn-work-in-python)。 – DSM 2014-09-02 16:57:55

+0

@DSM,感謝您的評論。我相應地更新了答案。 – falsetru 2014-09-02 17:01:23

0

試試這個:

[編輯:單詞添加列表支持查看基於管理員的要求。同時清洗的字典建築代碼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和通過|失敗|推遲到獲取類型。我使用列表理解來生成鍵和值的元組列表,然後我將其轉換爲字典

爲了構建字符串'passed | failed | ..'我使用字符串的.join函數將checkList中的單詞與管道字符作爲分隔符進行連接。

+1

'\ w +'可能會更好,只是一些可能的選擇。攫取後面的單詞會比他們可能的單詞更好。 – 2014-09-02 17:09:36

+0

所以,像'result = dict([(k,v)for(v,k)in re)。findall('(\ d {1,3})%\ w +',data)])'在%age之後抓住單詞? – aqoon 2014-09-03 14:15:44

+1

你還會如何讓'passed | failed | deferred'鏈接到一個帶有其他值的列表來檢查? – aqoon 2014-09-03 14:24:47