Python正则表达式,如何匹配字符串n次出现

时间:2017-04-19 23:56:05

标签: python regex

我想匹配包含单词100.00%的行,共计3次。

例如

# Instead of <%= render partial: "account", locals: { account: @buyer } %>
<%= render "account", account: @buyer %>

所以第1行和第3行都应该匹配。

然而,我的以下正则表达式似乎只与100.00%重复3次的案例相匹配。 (仅匹配第3行)

some string 100.00% foo 100.00% 100.00%
some string  99.91%  foo 100.00% 99.91%
some string 100.00%100.00%100.00%

我想知道我该如何匹配第1行呢?

谢谢大家!

3 个答案:

答案 0 :(得分:3)

Halemur Ali的回答比我为了完整而离开的回答要清晰得多。

符号{3}仅仅是一种快捷方式,您可以随时通过扩展重复序列来替换它。要匹配序列100.00%恰好出现3次的行,您可以使用:

"^(?:(?!100\.00%).)*(?:100\.00%(?:(?!100\.00%).)*){3}$"

这使用negative-lookaheads

可以这样阅读:

  • ^行开头
  • (?:(?!100\.00%).)*任何字符(零个或多个),直到100.00%序列
  • (?:100\.00% 100.00%序列
  • (?!100\.00%).)*后跟任何字符(零个或多个),直到100.00%序列
  • {3}重复3次
  • $行尾

考虑一下python的re模块文档。

注意:不需要括号来匹配单个字符。

答案 1 :(得分:2)

需要更简单正则表达式的替代方法是查找匹配100.00%的所有子字符串,并测试count == 3。

例如

import re

p = re.compile(r'100\.00%')
texts = ['some string 100.00% foo 100.00% 100.00%',
         'some string  99.91%  foo 100.00% 99.91%',
         'some string 100.00%100.00%100.00%']

matches = [i for i, t in enumerate(texts)
           if len(re.findall(p, t)) == 3]
# matches = [0, 2]

答案 2 :(得分:0)

r'(100\.00%.*){3}'也应该做,并且可读,简洁,并且(我认为)高效。