2016-04-05 32 views
3

下面的代碼工作正常拆分蟒蛇正則表達式的代碼爲多行

#!/usr/bin/python3 

import re 

preflist = 'ip prefix-list PL_FROM_7600 seq 255 permit 192.168.0.0/15 ge 20 le 25' 
mymatch = re.search(r'(ip prefix-list) (?P<prefname>\w+) (?P<prefseq>seq \d+) (permit|deny)', preflist) 

print(mymatch) 

if mymatch is not None: 
    print(mymatch.group('prefname')) 
    print(mymatch.group('prefseq')) 

並打印這就證明我的正則表達式工作正常的情況如下:所以現在

[[email protected]:14:14:58~/scripts]$ ./retest.py 
<_sre.SRE_Match object; span=(0, 42), match='ip prefix-list PL_FROM_7600 seq 255 permit'> 

PL_FROM_7600 

seq 255 

我試圖分裂這變成了多行(PEP8符合maximum 72 characters per line)使用re.VERBOSE,但不斷收到錯誤。我已經嘗試幾乎所有的組合,包括re.compile和使用原始或不。

這裏是我直接從python控制檯嘗試的例子;

>>> preflist = 'ip prefix-list PL_FROM_7600 seq 255 permit 192.168.0.0/15 ge 20 le 25' 

>>> myregex = re.compile(r''' 
... (ip prefix-list) 
... (?P<prefname>\w+) 
... (?P<prefseq>seq \d+) 
... (permit|deny) 
... ''', re.VERBOSE) 

>>> myregex 
re.compile('\n(ip prefix-list)\n(?P<prefname>\\w+)\n(?P<prefseq>seq \\d+)\n(permit|deny)\n', re.VERBOSE) 

>>> x = myregex.search(preflist) 
>>> x 
>>> print(x) 
None 

,我曾嘗試另一個例子......

>>> mypattern =''' 
... (ip prefix-list) 
... (\s?P<prefname>\w+) 
... (\s?P<prefseq>seq \d+) 
... (\spermit|deny) 
... ''' 

>>> mypattern 
'\n(ip prefix-list)\n(\\s?P<prefname>\\w+)\n(\\s?P<prefseq>seq \\d+)\n(\\spermit|deny)\n' 

>>> preflist = 'ip prefix-list PL_FROM_7600 seq 255 permit 192.168.0.0/15 ge 20 le 25' 
>>> preflist 
'ip prefix-list PL_FROM_7600 seq 255 permit 192.168.0.0/15 ge 20 le 25' 


>>> mymatch = re.search(mypattern, preflist,re.VERBOSE) 

>>> mymatch 
>>> print(mymatch) 
None 
>>> 
+0

你在模式中有字面空格,用'\ s'或'\ s +'替換它們(見'seq \ d +')。 –

回答

1

你需要考慮你的模式空間。所有不在字符類內的字面空格都會被忽略。您可以將空格與\s+(1個或多個空格)或[ ]+(匹配1個以上的空格)匹配。

我建議堅持\s,因爲它是唯一或多或少可移植的解決方案(在Java自由空間模式下,即使在字符類內也會忽略空格)。

(ip\s+prefix-list)\s+ 
(?P<prefname>\w+)\s+ 
(?P<prefseq>seq\s+\d+)\s+ 
(permit|deny) 

regex demoPython code demo

import re 
myregex = re.compile(r''' 
(ip\s+prefix-list)\s+ 
(?P<prefname>\w+)\s+ 
(?P<prefseq>seq\s+\d+)\s+ 
(permit|deny) 
''', re.VERBOSE) 
preflist = 'ip prefix-list PL_FROM_7600 seq 255 permit 192.168.0.0/15 ge 20 le 25' 
mymatch = myregex.search(preflist) 
print(mymatch) 
# => <_sre.SRE_Match object; span=(0, 42), match='ip prefix-list PL_FROM_7600 seq 255 permit'> 
+1

感謝這個工作,我今天早上嘗試'\ s'沒有'+',因爲我只需要一個空格,但是隻在括號後面的每個子語句之後才加上。我沒有意識到我應該在括號內使用它。爲了保護隱私,您能否將您的代碼中的IP地址替換爲192.168.0.0/15?發帖之前,我忘了這麼做。我已經更新了我的原始文章。 – Fabou78

+0

regex101不會獲取共享網址,我會在它工作後更新。 –

+1

謝謝你。 – Fabou78

1

您可以通過拆分原來你的正則表達式避免使用re.VERBOSE:

mymatch = re.search(r'(ip prefix-list) ' # comment 
       '(?P<prefname>\w+) ' # some text 
       '(?P<prefseq>seq \d+) ' # more comments 
       '(permit|deny)' 
       , preflist) 

這與您第一個例子中效果很好。

+0

非常感謝它的運作 – Fabou78