我有以下文本
text = 'Monday to Friday 12 midnight to 5am 30% . Midnight Friday to 6am Saturday 30% . 9pm Saturday to Midnight Saturday 25% . Midnight Saturday to 6am Sunday 100% . 6am Sunday to 9pm Sunday 50%'
当我使用普通正则表达式时,我获得了以下结果
import re
regex = '\d{1}[a|p]m'
re.findall(regex, text)
# Returned:
['5am', '6am', '9pm', '6am', '6am', '6pm']
然而,当我在 spaCy 中使用相同的 正则表达式
时,却什么也没有得到。
from spacy.matcher import Matcher
nlp = spacy.load('en_core_web_lg')
matcher = Matcher(nlp.vocab)
pattern = [{'TEXT': {'REGEX': '\d{1}[a|p]m'}}]
matcher.add('TIME', None, pattern)
doc = nlp(text)
matches = matcher(doc)
for match_id, start, end in matches:
matched_span = doc[start:end]
print(matched_span.sent.text)
这是否意味着我们不能在spaCy中使用普通的正则表达式?如果是这样,你知道我在哪里可以学习spaCy的特殊正则表达式语法吗?谢谢。
regex = r'\d[ap]m'
。(说明:FYI 是“供参考”的意思,r 表示使用原始字符串,\d 匹配数字,[ap] 匹配 a 或 p。) - Wiktor StribiżewREGEX
运算符时,请记住它是针对单个标记而不是整个文本进行操作的。您提供的每个表达式都将在一个标记上匹配。如果您需要在整个文本上进行匹配,请参阅正则表达式匹配整个文本上的详细信息。” - MonkeyZeussingle token, not the whole text
是什么意思,因为我认为6am、6pm等都是单个token。直到读了Wiktor的答案,我才明白spaCy将它们视为2个而不是1个token。我想知道为什么spaCy这样做,因为这对我来说似乎不是“自然”的? - Nemo