我想創建正則表達式來過濾文本文件中的某些文本。我想要過濾的格式如下:如何在Python中創建正則表達式?
word_*_word.word
例如,我想每個匹配的python代碼。樣品結果將爲:
program1_0.0-1_log.build
program2_0.1-3_log.build
我該怎麼做?
非常感謝您的幫助
我想創建正則表達式來過濾文本文件中的某些文本。我想要過濾的格式如下:如何在Python中創建正則表達式?
word_*_word.word
例如,我想每個匹配的python代碼。樣品結果將爲:
program1_0.0-1_log.build
program2_0.1-3_log.build
我該怎麼做?
非常感謝您的幫助
嘗試這樣:
r'[a-zA-Z0-9]+_[^_]+_[a-zA-Z0-9]+\.[a-zA-Z0-9]+'
嘗試^\w+_.*_\w+\.\w+$
Python的正則表達式模塊稱爲re
。您需要將其導入和使用provided functions:
import re
if re.match(r'\w+_.*_\w+.\w+', "some_text_abc.x"):
print "yeah."
它與r
前綴正則表達式字符串,所以,這將是字面解釋,無需特殊處理轉義字符有用。否則,反斜槓將被python解釋器專門處理,並且正則表達式的一部分的反斜槓需要被轉義。
這與匹配「任意數目的下劃線」似乎很奇怪(並且不符合OP的示例)。 – 2009-12-12 23:34:34
@Alex:你說的沒錯,我修正了 – sth 2009-12-12 23:37:49
@sth,tx - 同樣,'re.match'只匹配字符串的_start_(就好像模式以隱含的'^'開始,在感覺),所以它可能不會像OP所要求的那樣得到文件中的「每一個匹配」。 – 2009-12-12 23:39:29
看起來你想使用模式,如r'\w+_.*_\w+\.\w+'
- 假設*
你有沒有表示「零個或多個完全任意字符」(如果沒有,那麼中間的.*
部分需要相應更改)。一旦你有正確的模式(具體取決於你的意思*
;-),你可以re.compile
它得到一個正則表達式對象,並使用RE對象的.findall
方法,以整個字符串作爲參數,得到一個匹配這個模式的所有非重疊子串的列表(如果你想一次獲得一個這樣的子串,也可以循環使用這些子串),也可以使用其他的替代方法,如.finditer
。
我不明白你爲什麼需要這裏的正則表達式。 如果你想字符串以「.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 _"
您可能更喜歡使用正則表達式來查找具有1行代碼的東西,而不是多行循環。 – 2009-12-13 06:52:41
我很少使用Python的正則表達式,除非絕對必要。 IMO使用Python的內部字符串方法也更快。 – ghostdog74 2009-12-13 08:10:19
你不會得到「每一場比賽」,作爲OP的願望,通過固定的模式,使其只匹配的整行(如果你還記得指定'重.MULTILINE' - 否則,只有整個文件,並且只有在沒有指定're.DOTALL' ;-)的情況下沒有新行。 – 2009-12-12 23:36:09