2009-12-12 32 views
0

我想創建正則表達式來過濾文本文件中的某些文本。我想要過濾的格式如下:如何在Python中創建正則表達式?

word_*_word.word 

例如,我想每個匹配的python代碼。樣品結果將爲:

program1_0.0-1_log.build 
program2_0.1-3_log.build 

我該怎麼做?

非常感謝您的幫助

回答

3

嘗試這樣:

r'[a-zA-Z0-9]+_[^_]+_[a-zA-Z0-9]+\.[a-zA-Z0-9]+' 
0

嘗試^\w+_.*_\w+\.\w+$

+0

你不會得到「每一場比賽」,作爲OP的願望,通過固定的模式,使其只匹配的整行(如果你還記得指定'重.MULTILINE' - 否則,只有整個文件,並且只有在沒有指定're.DOTALL' ;-)的情況下沒有新行。 – 2009-12-12 23:36:09

1

Python的正則表達式模塊稱爲re。您需要將其導入和使用provided functions

import re 
if re.match(r'\w+_.*_\w+.\w+', "some_text_abc.x"): 
    print "yeah." 

它與r前綴正則表達式字符串,所以,這將是字面解釋,無需特殊處理轉義字符有用。否則,反斜槓將被python解釋器專門處理,並且正則表達式的一部分的反斜槓需要被轉義。

+0

這與匹配「任意數目的下劃線」似乎很奇怪(並且不符合OP的示例)。 – 2009-12-12 23:34:34

+0

@Alex:你說的沒錯,我修正了 – sth 2009-12-12 23:37:49

+0

@sth,tx - 同樣,'re.match'只匹配字符串的_start_(就好像模式以隱含的'^'開始,在感覺),所以它可能不會像OP所要求的那樣得到文件中的「每一個匹配」。 – 2009-12-12 23:39:29

2

看起來你想使用模式,如r'\w+_.*_\w+\.\w+' - 假設*你有沒有表示「零個或多個完全任意字符」(如果沒有,那麼中間的.*部分需要相應更改)。一旦你有正確的模式(具體取決於你的意思* ;-),你可以re.compile它得到一個正則表達式對象,並使用RE對象的.findall方法,以整個字符串作爲參數,得到一個匹配這個模式的所有非重疊子串的列表(如果你想一次獲得一個這樣的子串,也可以循環使用這些子串),也可以使用其他的替代方法,如.finditer

0

我不明白你爲什麼需要這裏的正則表達式。 如果你想字符串以「.build」結尾,比如,你可以

s="blah blah program1_0.0-1_log.build blah blah"  
for item in s.split(): 
    if item.endswith(".build"): 
     print item 

做到這一點,僅此而已。如果你想要做進一步的檢查,然後

for item in s.split(): 
    if item.endswith(".build"): 
     s = item.split("_") 
     if len(s) != 3: 
      print "not enough _" 
+0

您可能更喜歡使用正則表達式來查找具有1行代碼的東西,而不是多行循環。 – 2009-12-13 06:52:41

+0

我很少使用Python的正則表達式,除非絕對必要。 IMO使用Python的內部字符串方法也更快。 – ghostdog74 2009-12-13 08:10:19