2014-03-24 34 views
1

我有很多字符串(串行格式)和一個單詞列表的CSV格式。我需要匹配表達式並返回csv頂部的單詞。例如:我有他們作爲返回匹配的發生,正則表達式

Hsr layout 
aecs layout 
garden layout 
k aecs layout 

,並假設我的字符串包含:

str1 = "room no 135 chancery hotel,block k aecs layout" 

由於發生上述k aecs layoutaecs layout,我想表達的匹配aecs layout。我的代碼返回後者。我怎麼能優先考慮它?

我的代碼:

str1 = "room no 135 chancery hotel,block k aecs layout" 
layouts_string1 =r'({})'.format('|'.join(['hsr layout','aecs layout','garden layout','k aecs layout'])) 
layout1_re = re.compile(layouts_string1) 
ms = layout1_re.search(str1) 
print ms.group() 

但這返回"k aecs layout"。我如何得到那個在'|'中排在第一位的即aecs layout表達?

回答

1

原因k aecs layout比賽,而不是aecs layout,是因爲k信而來的a信之前,因此,正則表達式查找在k,而不是後來的a比賽。

一個解決辦法是寫一個循環:

str1 = "room no 135 chancery hotel,block k aecs layout" 
for match in ['hsr layout','aecs layout','garden layout','k aecs layout']: 
    layout1_re = re.compile(match) 
    ms = layout1_re.search(str1) 
    if ms: 
     print ms.group() 
     break 

Out: 
>>> 
aecs layout 

您通過多次有循環的原因是:如果你想某些賽事優先,你必須檢查字符串的結尾最高優先級匹配,然後才能使用其他匹配項檢查字符串。

你的使用情況其實很簡單,但是,如果我可以建議沒有正則表達式的一個簡單的解決方案:

str1 = "room no 135 chancery hotel,block k aecs layout" 
for match in ['hsr layout','aecs layout','garden layout','k aecs layout']: 
    if match in str1: 
     print match 
     break