Как извлечь IP-адрес с помощью регулярного выражения с помощью Spacy Phrase Matcher

text="Link down , Bypass (92.33.2222.88)  is not pinging"

doc=nlp(text)


pattern= [ {"TEXT": {"REGEX": "[\(][0-9]+[\.][0-9]+[\.][0-9]*[\.][0-9]*[\)]"}}]
matcher=Matcher(nlp.vocab)
matcher.add("ip",None, pattern)
matches=matcher(doc)
matches
[]    
# no match found!!

В противном случае регулярное выражение работает нормально:

re.findall("[\(][0-9]+[\.][0-9]+[\.][0-9]*[\.][0-9]*[\)]" ,text)

Выход: ['(92.33.2222.88)']


person paramita das    schedule 25.05.2020    source источник


Ответы (1)


Прежде всего, (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
person Wiktor Stribiżew    schedule 25.05.2020
comment
Спасибо .. Я хотел сопоставить (digit.digit.digit.digit) и шаблон = [{TEXT: {REGEX: r ^ \ d + (?: \. \ D +) {3} $}}] работает отлично .. Да, (92.33.2222.88) не является действительным IP-адресом, я набрал его случайным образом, чтобы дать пример .. - person paramita das; 26.05.2020