因此,我正在努力让自己了解regexp。第一个查询没有给我结果,但第二个却给了我。我没道理,为什么呢?
我正在尝试标记句子,
text = 'The interest does not exceed 8.25%.'
pattern = r'\w+|\d+\.\d+\%|[^\w+\s]+'
tokenizer = RegexpTokenizer(pattern)
tokenizer.tokenize(text)
这给了我
['The', 'interest', 'does', 'not', 'exceed', '8', '.', '25', '%']
我想要
['The', 'interest', 'does', 'not', 'exceed', '8.25%']
I get my result with,
pattern = r'\d+\.\d+\%|\w+|[^\w+\s]+'
为什么第二种模式可以工作?两种查询都不行吗?
答案 0 :(得分:2)
问题是\w
与字母,数字和下划线匹配。由于表达式首先出现在您的ored表达式中,因此具有优先权。
['The', 'interest', 'does', 'not', 'exceed', '8', '.', '25', '%']
\w+ \w+ \w+ \w+ \w+ \w+ [^\w\s]+ \w+ [^\w\s]+
第二个表达式永远不会匹配,因为第一个表达式部分消耗了它。
反转ored表达式:
r'\d+\.\d+\%|\w+|[^\w\s]+'
仅使用基本的re
模块进行测试:
text = 'The interest does not exceed 8.25%.'
pattern = r'\d+\.\d+%|\w+|[^\w\s]+'
print(re.findall(pattern,text))
打印:
['The', 'interest', 'does', 'not', 'exceed', '8.25%', '.']
(请注意,您不必逃脱%
)