2011-05-11 22 views
0

在我的程序中,我使用正則表達式直到單詞中斷,然後再次使用它,直到單詞停止。該方案的第一部分將比賽從軍事時間轉換爲常規時間。第二部分按照用戶輸入的數字來劃分軍事時間。我的代碼有效,但我使用了我的正則表達式兩次。如何改變我的程序,所以我只使用一次正則表達式。使用正則表達式開始和停止

with open(filename) as text: 
     for line in text: 
      pattern = re.search(r'((((2)([0-3]))|(([0-1])([0-9])))([0-5])([0-9]))', line) 

      if pattern: 

      if re.match("BREAK", line): 
       break 

     for line in text: 
      m= re.search(r'((((2)([0-3]))|(([0-1])([0-9])))([0-5])([0-9]))', line) 
      if m: 

      if re.match("STOP", line): 
       break 
+1

're.match( 「BREAK」,行)' - >'在line' – 2011-05-11 23:40:47

+0

@Jochen Ritzel 'BREAK':沒有,line.startswith(」 BREAK「)給出了相同的含義。 re.match!= re.search。 – 2011-05-12 02:10:37

回答

5

首先,你的正則表達式r'((((2)([0-3]))|(([0-1])([0-9])))([0-5])([0-9]))'有一個荒謬的數目的括號。

假設您沒有使用如此創建的捕獲組。您似乎想要匹配HHMM,其中HH爲00至23,MM爲00至59.

r'(2[0-3]|[01][0-9])[0-5][0-9]將執行相同的工作。您可以通過執行r'(?:2[0-3]|[01][0-9])[0-5][0-9]'來避免剩下的一個捕獲組。

您可能希望通過(例如)在模式的每個末端具有\b來避免虛假匹配(例如「blah 23456789」中的「2345」)。

這裏是爲您的代碼替換:

import re 
searcher = re.compile(r'\b(?:2[0-3]|[01][0-9])[0-5][0-9]\b').search 
with open(filename) as text: 
     for line in text: 
      m = searcher(line) 
      if m: 
       do_something_1(line, m) 
      if line.startswith("BREAK"): # equivalent to your code; is that what you really mean?? 
       break 
     for line in text: 
      m = searcher(line) 
      if m: 
       do_something_2(line, m) 
      if line.startswith("STOP"): # equivalent to your code; is that what you really mean?? 
       break 
+0

謝謝。我知道我的正則表達式有許多括號。仍然習慣於小組 – Aaron 2011-05-12 02:14:28

2

最簡單的方法是使用

my_re = re.compile("your regex") 
my_re.search(some_string) 
my_re.search(some_other_string) 
避免定義兩次正則表達式

根據文檔的內容,您可以拆分'BREAK'或匹配多個,難以理解,無需查看示例或更多定義。