2011-02-23 44 views
1

重新使用模塊模式之間的線我有一個字符串(多線),它包含以下內容:如何搭配的蟒

"Name=My name 
Address=...... 
\##### To extract from here #### 
line 1 
line 2 
line 3 
\##### To extract till here #### 
close" 

我如何提取"##### To extract *"串包括模式以及之間的界限?

輸出應該是以下幾點:

\##### To extract from here #### 
line 1 
line 2 
line 3 

回答

3
pat = re.compile('\\\\##### To extract from here ####' 
       '.*?' 
       '(?=\\\\##### To extract till here ####)', 
       re.DOTALL) 

pat = re.compile(r'\\##### To extract from here ####' 
       '.*?' 
       r'(?=\\##### To extract till here ####)', 
       re.DOTALL) 
+0

非常感謝這工作。但沒有任何反斜槓的模式。 – 2011-02-23 09:44:28

+0

@Sandhya如果你編寫're.compile(r'#####從這裏提取####'... etc'匹配將從'#####開始#####從這裏提取## ##'',而不是''\ #####從這裏提取####''。這仍然很好,相反如果你寫''(?= #####提取到這裏####)'',反斜槓字符將會被捕獲到''。*?''部分。這不是你想要的,據我所知 – eyquem 2011-02-23 10:04:11

+0

+1這個解決方案可能比使用' str.find()'然而,實際上這隻在一個非常大的搜索字符串或提取被執行很多次的情況下才有意義。正則表達式的優點是它們在檢測提取標記時更加靈活。 – 2011-02-23 12:05:06

2

你不需要爲正則表達式,簡單string.find就足夠了。

只需找到這兩個字符串,並輸出它們之間的部分輸入(通過切分字符串),注意避免輸出第一個字符串(即注意其長度)。

或者,您可以使用兩個電話string.split

0
>>> s 
'\nName=My name\nAddress=......\n\\##### To extract from here ####\nline 1\nline 2\nline 3\n\\##### To extract till here ####\nclose' 
>>> for o in s.split("\n"): 
...  if "##" in o and not flag: 
...  flag=1 
...  continue 
...  if flag and not "##" in o: 
...  print o 
...  if "##" in o and flag: 
...  flag=0 
...  continue 
... 
line 1 
line 2 
line 3 
2

Ofir是正確的。這裏有一個相應的例子:

>>> s = """... your example string ...""" 
>>> marker1 = "\##### To extract from here ####" 
>>> marker2 = "\##### To extract till here ####" 
>>> a = s.find(marker1) 
>>> b = s.find(marker2, a + len(marker1)) 
>>> print s[a:b] 
\##### To extract from here #### 
line 1 
line 2 
line 3 
+1

如果有一條線' 「\ #####要提取到這裏####」 行'」前' \ #####爲了從這裏提取####「',這段代碼不會給出正確的東西。所以你需要寫'b = ch.find(「\ #####提取到這裏####」,a + 32)' – eyquem 2011-02-23 09:40:55

+0

@eyquem:對,我改變了代碼來處理這種情況。 – 2011-02-23 10:17:12

+0

+1,因爲它也是一個很好的解決方案,find()是一個非常快速的函數,並且正則表達式並不總是必需的 – eyquem 2011-02-23 11:15:53