Spacy Matcher中\d{1,4}正则表达式匹配异常问题求助
SpaCy Matcher 中
\d{1,4} 正则无法匹配的问题 你在使用SpaCy Matcher时遇到问题:定义了两个正则匹配模式,pnum1 使用 \d{1,4} 试图匹配1-4位数字的token,但完全没有匹配结果;而 pnum2 使用 \d+ 可以正常匹配所有数字token。测试代码如下:
pnum1 = [{'TEXT':{'REGEX':fr"\d{1,4}"}}] pnum2 = [{'TEXT':{'REGEX':fr"\d+"}}] import spacy from spacy.matcher import Matcher nlp = spacy.load("en_core_web_sm") appli=''' it has three 56 cows 1087 10b, reg too long number: 12344''' matcher = Matcher(nlp.vocab) doc = nlp(appli) matcher.add("num1",[pnum1]) #matcher.add("num2",[pnum2]) matches = matcher(doc) reg =[{'TEXT': {'REGEX':fr"reg"}}] #matcher.add("reg", [reg]) print(len(matches)) for match_id, start, end in matches: matched_span = doc[start:end] print('matched',matched_span.text)
预期匹配56、1087这类1-4位的数字token,但pnum1无任何匹配结果。
问题原因
问题出在f-string的解析逻辑上:你使用了fr"\d{1,4}",但f-string会把{1,4}解析为Python元组,最终生成的正则表达式是\d(1, 4),而不是你预期的\d{1,4}。这个错误的正则自然无法匹配任何数字token。
解决方案
有两种修正方式:
- 不使用f-string,直接用raw字符串:
pnum1 = [{'TEXT':{'REGEX':r"\d{1,4}"}}] - 在f-string中转义大括号:在f-string中,要输出单个
{或},需要写两个连续的{{或}}:pnum1 = [{'TEXT':{'REGEX':fr"\d{{1,4}}"}}]
修正后,pnum1就能正确匹配所有1-4位纯数字的token(比如示例中的56、1087),而10b(包含非数字字符)、12344(超过4位)会被排除,符合预期。
内容的提问来源于stack exchange,提问作者JFerro
相关产品推荐
相关产品推荐

