或者在python

时间:2016-08-10 06:09:59

标签: python regex string

我需要制定一个正则表达式,只选取特定字符串的第一部分而不是第二部分。例如:

      (part1)                        (Part2)    
        SAI                           Table


                                      Cloth


       DARA                                 

我想只提取SAI(即part1而不是part2)。请注意,第2行在第1部分中为空,因此它应返回空格(而不是cloth)。相同的正则表达式必须适用于所有三种字符串。对于string2,第一部分必须返回一个空格而不是table。两部分之间没有一定的空间长度。它各不相同。

这是我试过的正则表达式,但它只适用于string1和string3:

[\s]{1,}((?:[a-zA-Z)(@\-,."'',&*]+[\s]?)+)[\s]{2,}

有没有办法编写一个在这种情况下有用的正则表达式?

我只能在这里使用正则表达式,因为我需要它来返回那里存在的任何字符串。字符串可以是字母数字,可能包含我之前的正则表达式中最常用的符号。两者之间的空间永远不会固定。

我还需要它在第1部分中返回一个空的空格。我们可以忽略第2部分。但是我必须确保正则表达式与第2部分不匹配。

2 个答案:

答案 0 :(得分:1)

如果第一列( part1 始终后跟2个空格,而第二列( part2 )不是,则可以依赖在这种情况下,以防止在最后一列中匹配。我们可以使用lookahead (?=[\t ]{2})断言2个连续的空格或制表符。

<强>代码

import re

patt = r'^[\t ]*(\S+(?:[\t ]\S+)*(?=[\t ]{2})| )'
str = r'''
      (part1)                        (Part2)    
        SAI                           Table
                                      Cloth
       DARA                                 
'''

print re.findall(patt, str, re.MULTILINE)

<强>输出

['(part1)', 'SAI', ' ', 'DARA']

ideone demo

您也可以将\S更改为[a-zA-Z)(@\-,."'',&*]以限制允许的字符。

答案 1 :(得分:0)

使用命名捕获组,您可以区分捕获的部分:

(?: +(?P<one>(?:\w+)?))?(?: +(?P<two>(?:\w+)?))

Live demo