2011-09-21 82 views
0

我試圖創建一個svn pre-commit掛鉤,但無法讓我的正則表達式按預期工作。對於看起來不像「DEV-5 |某些消息」的消息,它應該打印False。我爲什麼在這裏變得真實?Python的正則表達式給出了意想不到的結果

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import re 
>>> p = re.compile("^\[[A-Z]+-[0-9]+\] | .+$", re.DOTALL) 
>>> message = "test message" 
>>> match = p.search(message) 
>>> bool(match) 
True 
+2

豎線|應\ –

回答

6
>>> p = re.compile("^[A-Z]+-[0-9]+ \| .+$", re.DOTALL) 
>>> print p.search("test message") 
None 
>>> print p.search("DEV-5 | some message") 
<_sre.SRE_Match object at 0x800eb78b8> 
  • 你不需要\[\]
  • 你需要逃避|
+0

進行轉義謝謝你,這是它'\ ['是複製/粘貼從另一個劇本,我完全忘了excaping'|' –

1

我還沒有運行的代碼,但我懷疑,在你的正則表達式替換(|)之後的部分任意非空字符串匹配開頭的空間,在這種情況下,它是" message"

4

罪魁禍首是尾隨 「| + $」,這是符合 '信息' 爲替代第一個正則表達式。正如Roman指出的那樣,你的意思是匹配文字'|'所以你必須將它作爲'\ |'來轉義。

看看發生了什麼被匹配,你可以這樣做:

print match.group() 
' message' 

(順便說一句,更快的非正則表達式的方法只能處理含有豎條將使用line.split(線「|」) :。

for line in ...: 
    parts = line.split('|',1) 
    if len(parts)==1: continue 
    (code,mesg) = parts 
+0

使用你的榜樣分裂將會破壞任何不包含'|'的行,只會有一個單獨的元素e結果所以你會得到'ValueError:需要多個值才能解包' – Duncan

+0

已修復。當我們不知道''split()'*將返回多少部分時,通常的成語是將其結果分配給一個序列,然後測試序列長度。 (或者趕上例外 - 不太優先)。還有另一個聰明的習慣用語[這裏](http://opensourcehacker.com/2010/04/17/how-to-split-strings-of-indefined-item-count-to-python-variables-elegantly/)附加[None] * n爲了確保結果元組已完成。* – smci

+0

追加'[None] * n'通常會非常混亂,但實際上在這種情況下它不會太糟糕:'code,mesg,* junk = line.split('|',1)+ [None]'儘管我現在仍然更喜歡代碼。 – Duncan

相關問題