2015-10-14 66 views
0

我有如下的樣本數據來支持多個空格:正則表達式使用python

(1) fshfonlpjspfmnfmnsjoide     (2)dfljslmnljoifsjdjmfdsjf 
foslndlknjhoihfodsiolnlnlkdfshoipfjhndfs subsection (3):wdjoinfeiu 
(3)fwshfnlfgnoiuhwsoiuheoklnfsojoihoisnf 
      (i)fdfssd 
      (ii)flshf 
    (4)fjdspfj;mf;jspiojepjasm;lfmsdjipoj 

對於上述樣品,我想在每個點處打破數據在哪裏接收段起始號碼例如(1), (2),(3)等模式

但我不想在像第(3)部分這不是一個實際的新段落點休息。

我用正則表達式:pattern_string = "(\n|\s\s\s\s\s\s\s)\(\d+\)"

時像(1),但犯規的情況下,工作的新線新的段落開始的時候不段的新生產線啓動例如它工作正常(2)在上面的示例中。 ,或者如果在新行的模式之前有單個空格,例如(4)之前有一個單獨的空間。

+0

目前還不清楚是什麼「節」和「款之間的差別「 – alfasin

+0

嗨Alfasin,部分由(1),(2),(3),(4)等代表。子部分只是在一個部分內的一些書面文本。 我的目的是打破部分層面的全文​​。但是,每個部分的編號都沒有固定的起點。例如(1)從新行開始時開始。 (2)從一行的中間開始,並有一個由多個空格組成的空白區域。 (4)從新行開始,但在它之前有一些空格。 爲了掩蓋新行,我使用了\ n並且在(2)之前使用了多個\ s來覆蓋多個空格。對於(4)來說,它不起作用,因爲它之前有一個空白處。 –

+0

如果您可以使用更易讀的文字,則可以獲得更多幫助。儘量不要砸太多的鍵盤 – JBernardo

回答

0

嘗試使用重複(也實在是很好的做法,原料(r'...')字符串的正則表達式:

r"(^|\n\s*|\s{7,})\((\d+)\)" 

這應該在

  1. 開始的字符串匹配的數字:^
  2. 新行即使有空格:\n\s*
  3. 經過幾個空格(至少7個):\s{7,}

例子:

>>> re.split(r"(?:^|\n\s*|\s{7,})\(\d+\)", your_text) 

['', 
' fshfonlpjspfmnfmnsjoide', 
'dfljslmnljoifsjdjmfdsjf\nfoslndlknjhoihfodsiolnlnlkdfshoipfjhndfs subsection (3):wdjoinfeiu', 
'fwshfnlfgnoiuhwsoiuheoklnfsojoihoisnf\n   (i)fdfssd\n   (ii)flshf', 
'fjdspfj;mf;jspiojepjasm;lfmsdjipoj'] 

只需刪除第一個空字符串,你已經得到了所有的4個部分

+0

嗨,謝謝你的迴應。我使用了剛分享的示例模式。但是,它不適用於\ n \ s *和\ s {7,}。 因此,如果一個部分從一條新線開始,但在開始時具有很少的空間,例如, ...(2)或者它在一行的中間開始,並且在它之前有多個空格,例如, abcdpqr .......(3), 它不起作用。 –

+0

@KunalBatra當然,它的工作原理。我剛剛展示了一個例子...因爲它使用'split'而不是'findall',我刪除了一些組。嘗試使用代碼 – JBernardo

+0

pattern9tring = r「(?:^。?| \ n \ s * | \ s {7,})\(\ d + \)pattern = re.compile(pattern_string )012fffff: \t fff.write(str(match.end() - 1)+「;」)打開(「temp.txt」,'wb')爲fff: print str(match.end())+「;」 以上是我正在使用的代碼。這個模式是否可以和finditer一起工作?任何更改將被作出。 –