Прежде всего, (92.33.2222.88)
не является действительным IP.
Если вас не волнует достоверность IP, следующая проблема заключается в том, что (
и )
не являются частью IP-токена, команда print([(t.text, t.pos_) for t in doc])
показывает ('92.33.222.88', 'NUM')
, поэтому ваш шаблон недействителен. здесь, потому что вы включили (
и )
в шаблон.
Если вы планируете сопоставить любые фрагменты digit.digits.digits.digits
, вы можете использовать
pattern= [ {"TEXT": {"REGEX": r"^\d+(?:\.\d+){3}$"}}]
matcher.add("ip", None, pattern)
Если вы хотите только сопоставить допустимые строки IPv4 используйте
octet_rx = r'(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
pattern= [ {"TEXT": {"REGEX": r"^{0}(?:\.{0}){{3}}$".format(octet_rx)}}]
matcher.add("ip", None, pattern)
Полный тестовый фрагмент:
import spacy
from spacy.matcher import Matcher
nlp = spacy.load("en_core_web_sm")
matcher = Matcher(nlp.vocab)
octet_rx = r'(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'
pattern= [ {"TEXT": {"REGEX": r"^{0}(?:\.{0}){{3}}$".format(octet_rx)}}]
matcher.add("ip", None, pattern)
doc = nlp("Link down , Bypass (92.33.222.88) is not pinging")
matches = matcher(doc)
for match_id, start, end in matches:
string_id = nlp.vocab.strings[match_id]
span = doc[start:end]
print(match_id, string_id, start, end, span.text)
# => 1699727618213446713 ip 5 6 92.33.222.88