2014-09-29 27 views
2

我需要使用正則表達式解析一行,其最後兩個參數是可選的。我給你一個例子和我寫的表達。Python中可選字段的正則表達式

驚歎號和名字在最後是可選的。

x = re.compile('(?P<stop_id>\d{9})\s*(?P<admin_one>[[\x00-\x7F]{6}|\s{6}])\s*' 
    '(?P<service_one>[[\x00-\x7F]{3}|\s{3])\s(?P<line_one>.{8})\s*' 
    '(?P<direction_one>[[\x00-\x7F]{1}|\s{1}])\s*(?P<admin_two>[[\x00-\x7F]{6}|\s{6}])\s*' 
    '(?P<service_two>[[\x00-\x7F]{3}|\s{3])\s(?P<line_two>.{8})\s*' 
    '(?P<direction_two>[[\x00-\x7F]{1}|\s{1}])\s*' 
    '(?P<interchange_time>[[\x00-\x7F]{3}|\s{3}])' 
    '(\s+(?P<exclaim>).{1})?(\s+(?P<stop_name>.+))?') 

,當我搜索它下面的字符串,

m = x.search('071124127 00006_ 022 94N  1 00006_ 022 83N  * 006 Radhuspladsen') 

它提供了以下輸出,當我做m.groups()

('071124127', '00006_', '022', '94N  ', '1', '00006_', '022', '83N  ', 
'*', '006', ' R', '', None, None) 

我需要exclaimNonestop_nameRadhuspladsen。 如何寫regex呢?

回答

1
(?P<stop_id>\d{9})\s*(?P<admin_one>[[\x00-\x7F]{6}|\s{6}])\s*(?P<service_one>[[\x00-\x7F]{3}|\s{3])\s(?P<line_one>.{8})\s*(?P<direction_one>[[\x00-\x7F]{1}|\s{1}])\s*(?P<admin_two>[[\x00-\x7F]{6}|\s{6}])\s*(?P<service_two>[[\x00-\x7F]{3}|\s{3])\s(?P<line_two>.{8})\s*(?P<direction_two>[[\x00-\x7F]{1}|\s{1}])\s*(?P<interchange_time>[[\x00-\x7F]{3}|\s{3}])(?:\s+(?P<exclaim>.{1}(?=\s)))?(?:\s*(?P<stop_name>.+))? 

嘗試this.This會給你stop_name .The問題是exclaim是吃了spaces所以stop_name不能得到任何空間啓動with.I改變了以\s*,以便它可以不受空間的開始以及。

查看演示。

http://regex101.com/r/dN8sA5/14

+0

嘿感謝,但這些似乎有些問題,因爲總是驚呼原來是無以下有效輸入。 >>> m = x.search('071124127 00006_ 022 94N 1 00006_ 022 83N * 006!') >>> m.groups() ('071124127','00006_','022','94N' ,'1','00006_','022','83N','*','006',None,'!') – 2014-09-29 11:19:49

+0

@IshanBhatt http://regex101.com/r/dN8sA5/13似乎一些間距issue.newaz試試這個 – vks 2014-09-29 11:26:21

+0

有一點可以肯定的是,歎號令牌只能包含'!'或者它不在那裏。看看是否有幫助。 – 2014-09-29 11:26:38

1

我認爲這個問題是?在最後一部分!你把問題標誌從括號中刪除,所以它也可以在\s+上運行!把它放在裏面,並在適當的位置也必須刪除.{1}exclaim結束! SP改成這樣:

'(\s+(?P<exclaim>))?(\s+(?P<stop_name>.+)?)' 

演示:http://regex101.com/r/kA8pE8/1