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一起工作?任何更改将被作出。 –