2014-08-30 25 views
2

我有一個代碼,用於分組中的單詞,如果它有paranthesis前有相同的名稱。分組使用正則表達式冒號':'

如:

car __name__(skoda,audi) 
car __name__(benz) 

輸出:

car __name__(skoda,audi,benz) 

但是當它亙古不變的輸出端設置一個冒號:

car __name__(skoda,audi):  =>no output prints with : 
car __name__(benz): 

我認爲這個問題是我的正則表達式

我的代碼:

import collections 
class Group: 
    def __init__(self): 
     self.members = [] 
     self.text = [] 
with open('out.txt','r') as f: 
    groups = collections.defaultdict(Group) 
    group_pattern = re.compile(r'(\S+(?: __[^__]*__)?)\((.*)\)$') 
    current_group = None 
    for line in f: 
     line = line.strip() 
     m = group_pattern.match(line) 
     if m: # this is a group definition line 
      group_name, group_members = m.groups() 
      groups[group_name].members.extend(group_members.split(',')) 
      current_group = group_name 
for group_name, group in groups.items(): 
     print "%s(%s)" % (group_name, ','.join(group.members)) 

回答

0

在正則表達式只是在最後添加:並使其加入?旁結腸,所以它會匹配兩種類型的字符串格式可選。

(\S+(?: __[^__]*__)?)\((.*)\):?$ 

DEMO

+0

「(\ S +(__ [^ __] * __)?)\((。*)\):?$」before':?'不需要我猜... – Anvesh 2014-08-30 06:43:29

0

的問題是,你在你的正則表達式的結尾有一個$。這迫使正則表達式尋找以括號結尾的模式。

(\S+(?: __[^__]*__)?)\((.*)\) 

或者你可以調整正則表達式的模式包括:

您可以通過丟棄$在正則表達式(如果你認爲還會有其他尾隨字符)解決它出現冒號的可能性爲0或1次:

(\S+(?: __[^__]*__)?)\((.*)\):?$ 
0

你可以做到這一點沒有正則表達式:

f = [ 'car __name__(skoda,audi):\n', 'car __name__(benz):\n' ] 
groups = {} 
for line in f: 
    v = line.strip().split('__') 
    gname, gitems = v[1], v[2] 
    gitems = gitems.strip("():").split(",") 
    groups[gname] = groups.get(gname, []) + gitems 
print groups