问题描述
我正在尝试以下模式:
pattern = [ {'ORTH': '('},{'SHAPE': 'd'},{'ORTH': ')'},{'SHAPE': 'dd'},{'ORTH': '-','OP': '?'},{'SHAPE': 'ddd'},{'SHAPE': 'dddd'}]
matcher.add('PHONE_NUMBER_E',None,pattern)
如果我在方括号后的电话号码中添加空格(例如(0)20 111 2222),则可以使用此功能,但不能这样做。我只是开始使用python,所以我确定我缺少一些简单的东西。感谢您的帮助。
解决方法
使用spacy进行匹配与使用regex匹配字符串有关的问题是,使用spacy时,您几乎[几乎]永远不会事先知道令牌生成器将对您的字符串执行什么操作:
带空格:
doc = nlp("This is my telephone number (0) 20 111 2222")
[tok.text for tok in doc]
['This','is','my','telephone','number','(','0',')','20','111','2222']
没有空格:
doc = nlp("This is my telephone number (0)20 111 2222")
[tok.text for tok in doc]
['This','0)20','2222']
请记住,您可以编写两种可以同时使用两种格式的模式:
doc = nlp("My telephone number is either (0)20 111 2222 or (0) 20 111 2222")
matcher = Matcher(nlp.vocab,validate=True)
pattern1 = [ {'ORTH': '('},{'SHAPE': 'd'},{'ORTH': ')'},{'SHAPE': 'dd'},{'ORTH': '-','OP': '?'},{'SHAPE': 'ddd'},{'SHAPE': 'dddd'}]
pattern2 = [ {'ORTH': '('},{'TEXT':{'REGEX':'[\d]\)[\d]*'}},{'SHAPE': 'dddd'}]
matcher.add('PHONE_NUMBER_E',None,pattern1,pattern2)
matches = matcher(doc)
for match_id,start,end in matches:
string_id = nlp.vocab.strings[match_id]
span = doc[start:end]
print(span)
(0)20 111 2222
(0) 20 111 2222