正则表达式(Reg exp)。为什么这样有效?

时间:2018-07-22 11:49:18

标签: python regex

因此,我正在努力让自己了解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]+'

为什么第二种模式可以工作?两种查询都不行吗?

1 个答案:

答案 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%', '.']

(请注意,您不必逃脱%