如何使用 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)
输出:['(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
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)']
首先,(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