2017-04-19 216 views
1

我想匹配3次出現的包含單詞100.00%的行。Python正則表達式,如何匹配出現次數爲n的字符串

e.g

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都應該匹配。

但是,我以下的正則表達式似乎只匹配有100.00%重複3次的情況。 (只匹配第3行)

re.search(r"([1][0][0]\.[0][0][%]){3}",string) 

我不知道該如何匹配第1行?

謝謝大家!

+0

它只匹配底線,因爲它們都觸摸。但第1行之間有東西,比如空格和'foo'。你目前的正則表達式並沒有考慮到這一點。 –

+0

這個怎麼樣? re.search('100 \ .00%。* 100 \ .00%。* 100 \ .00%',字符串) – Shiping

+0

@Shiping這將匹配具有'100'的字符串。00%'重複3次以上 – silel

回答

2

,需要一個簡單的正則表達式來查找匹配100.00%和測試,如果計數== 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] 
+0

非常感謝您的回答! – peterj

1

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倍
  • $結束

考慮採取看看re模塊的Python的文檔。

注意:括號不一定要匹配單個字符。

+0

你和Halemur Ali的答案都能解決我的問題,並且非常感謝您的詳細解釋! – peterj

0

r'(100\.00%.*){3}'也應該做的伎倆,所有子替代,而且是可讀的,簡潔的,並且(我認爲)是高性能的。

+0

也許'r'(100 \ .00%。*){3}'' –

+0

@HaleemurAli是的謝謝,在基數編輯和忘記逃生t_t –

+0

這也將匹配行超過3'100.00%'序列。 – silel

相關問題