2013-01-16 61 views
0

我在使用Python 2.7.3正則表達式嘗試在大輸入中查找新行字符時遇到問題。我有這樣的事情:Python:正則表達式排除多行輸入中的字符串/字

type="thing" blahblahblah 
something id="123456" 
... 
type="disabled thing" blahblahblah 
somethingelse id="123457" 
... 

我想獲得所有的ids where type =「thing」。由於貪婪的正則表達式引擎,我必須寫出如下正則表達式:

r'type="thing"(?!type).+id="[0-9]{6,7}"', re.S 

但是,這不起作用。如何使用這種輸入數據製作排除字符串正則表達式?

+0

所以,你需要'類型= 「已禁用的事」'? – ATOzTOA

回答

0

如果我正確理解你的問題(編輯之前),你希望這兩個行都與一個id相關聯。在這種情況下,你需要沿着這些路線的東西(假設新線由「\ n」標記):

>>> import re 
>>> t = """ 
type="thing" blahblahblah 
something id="123456" 
... 
type="disabled thing" blahblahblah 
somethingelse id="123457" 
... 
""" 
>>> q = re.compile(r'type="thing".*\n.*\n') 
>>> q.findall(t) 
['type="thing" blahblahblah\nsomething id="123456"\n'] 
>>> for s in q.findall(t): 
    print s 

type="thing" blahblahblah 
something id="123456" 

如果你不使用re.S,可以更有效地控制的貪婪你表達。你的.+加上re.S將使你的表情貪婪,否則你將不得不考慮。你也可以使用類似.+?。加號後面的問號會使你的表情不再貪婪,但我會選擇更簡潔的表達方式。

+0

我沒有注意到每個塊的頭部有固定的行數...謝謝,這個作品! – Norrius

+0

很高興工作。 –

0

使用此:

r'type="thing"[\s\S]+?id="([0-9]{6,7})"', re.S 

例子:

import re 

s = b'''"type="thing" blahblahblah 
something id="123456" 
.... 
type="thing" blahblahblah 
something id="123459" 
.... 
type="disabled thing" blahblahblah 
somethingelse id="123457"''' 

expr = re.compile(r'type="thing"[\s\S]+?id="([0-9]{6,7})"', re.S); 

c = expr.findall(s) 

for c1 in c: 
    print ".." 
    print c1 

輸出:

>>> 
.. 
123456 
.. 
123459 
+0

你能解釋一下'?'嗎?登入'[\ s \ S] *?'呢? – Norrius

+0

它匹配包括換行符在內的所有字符。我試圖阻止這種貪婪,但顯然沒有工作......需要'+?'。 – ATOzTOA

+0

我很好奇你爲什麼選擇[\ s \ S]而不是簡單的點(。)。 –

相關問題