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何が起こっている上の任意のアイデア:サミュエルの答えは、私がテストしているが、すべてのケースが一致していないように見える
後
- たIPプレフィクスリストをPL_FROM_7600 seq 10 permit 192.168.1.80/28
- ip prefix-list PL_FROM_7600 seq 20 permit 192.168.1.80/28 ge 23 le 25
- IPプレフィクスリストのPL_FROM_7600の配列30許可192.168.1.80/28 GE 23
- 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})))?
今、すべてのケースと一致するように見えます。おかげさまでサム。
私は既に投票していますが、私の投稿に何が間違っているのだろうか? – Fabou78