2016-04-08 17 views
-2

regex101でうまく動作しているような次の正規表現があります。 ご覧のとおり、4つの組み合わせが可能です。有効な正規表現がPythonで動作しない

これをPythonで実装したい場合、regex101文字列フィールドの最初の行(ネットワークアドレスの後ろには何も書かれていない行)と似た行を見つけようとすると、全く一致しません。ここでは、コード

import re 

l_side = 'ip prefix-list PL_FROM_7600 seq 40 permit 192.168.10.0/23' 

myregex = re.compile(r''' 
(ip\sprefix-list)\s 
(?P<prefnam>\w+)\s 
(?P<prefseq>seq\s\d+)\s 
(permit|deny)\s 
(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}\/[1-3]?\d)\s 
((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})| 
(?P<prefge>ge\s\d{1,2})| 
(?P<prefle>le\s\d{1,2})|) 
''', re.VERBOSE) 
l_match = myregex.search(l_side) 

print(l_match.group('prefnam')) 
print(l_match.group('prefgele')) 

ここでは、私は正規表現

((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})| 
(?P<prefge>ge\s\d{1,2})| 
(?P<prefle>le\s\d{1,2})|) 

からfolowingを削除する場合、私は

Traceback (most recent call last): 
    File "./testing.py", line 19, in <module> 
    print(l_match.group('prefnam')) 
AttributeError: 'NoneType' object has no attribute 'group' 

を取得するエラーは、それが動作しますです。

私がここで一致させようとしているのは、存在度がgeleまたはleまたはgeであるか何も存在しないことです。私は運がないと次のことを試みました。

((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})| 
(?P<prefge>ge\s\d{1,2})| 
(?P<prefle>le\s\d{1,2})|(.?)) 

ここ

EDIT1何が起こっている上の任意のアイデア:サミュエルの答えは、私がテストしているが、すべてのケースが一致していないように見える

  1. たIPプレフィクスリストをPL_FROM_7600 seq 10 permit 192.168.1.80/28
  2. ip prefix-list PL_FROM_7600 seq 20 permit 192.168.1.80/28 ge 23 le 25
  3. IPプレフィクスリストのPL_FROM_7600の配列30許可192.168.1.80/28 GE 23
  4. IPプレフィクスリストのPL_FROM_7600の配列192.168.1.80/28ル23

1と2が一致している40の許可ではなく3と4

私が改正されてきたサミュエルの正規表現はに:

(ip\sprefix-list)\s 
(?P<prefnam>\w+)\s 
(?P<prefseq>seq\s\d+)\s 
(permit|deny)\s 
(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:\/[1-3])?\d) 
((\s(?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2}))| 
(\s(?P<prefge>ge\s\d{1,2}))| 
(\s(?P<prefle>le\s\d{1,2})))? 

今、すべてのケースと一致するように見えます。おかげさまでサム。

+0

私は既に投票していますが、私の投稿に何が間違っているのだろうか? – Fabou78

答えて

2

この正規表現は?

(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}\/[1-3]?\d) 

(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:\/[1-3])?\d) 

に置き換えるため

import re 

l_side = 'ip prefix-list PL_FROM_7600 seq 40 permit 192.168.10.0/23' 

myregex = re.compile(r''' 
(ip\sprefix-list)\s 
(?P<prefnam>\w+)\s 
(?P<prefseq>seq\s\d+)\s 
(permit|deny)\s 
(?P<prefnet>(?:[0-9]{1,3}\.){3}[0-9]{1,3}(?:\/[1-3])?\d)(\s 
(?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})| 
(?P<prefge>ge\s\d{1,2})| 
(?P<prefle>le\s\d{1,2})|)? 
''', re.VERBOSE) 
l_match = myregex.search(l_side) 

print(l_match.group('prefnam')) 
#print(l_match.group('prefgele')) 

diffがあると私は

\s 
((?P<prefgele>ge\s\d{1,2}\sle\s\d{1,2})| 
(?P<prefge>ge\s\d{1,2})| 
(?P<prefle>le\s\d{1,2})|) 

で交換した後
+0

いいキャッチ!これは、Regex101のようなオンラインテスターの共通の欠点です。つまり、各行をスタンドアロンの文字列のように扱うことはできません。最後に改行を入れません。ちなみに、その最後の '|'は、囲むグループがオプションなので冗長です。 –

+0

アドバイスありがとうございました –

+0

メルシー・サミュエル。 'ge XX XX'のときにうまく動作しているようですが、 'ge XX'や 'le XX 'のときは対応するグループをキャプチャしません。また、私は正規表現の終わりに行った変更を理解していますが、あなたは "diffはあなたのためのもの"と言う "prefnet"ビットを取得しません。あなたの説明に費やすことができますか? – Fabou78