如何使用regex提取IP地址,使用spacy Phrase matcher。

问题描述 投票:1回答:1
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!!

否则,regex工作正常。

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

输出: ['(92.33.2222.88)']

regex spacy matcher phrase
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.