簡體   English   中英

如何使用 spacy 短語匹配器使用正則表達式提取 IP 地址

[英]How to Extract IP address using regex using 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)

Output: ['(92.33.2222.88)']

首先, (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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM