如何在Python中使用If-Then-Else正则表达式的正面lookbehind

时间:2013-12-06 19:03:55

标签: python regex

我正在尝试将正面的lookbehind与用于Python中的正则表达式的If-Then-Else语法结合起来。

我要做的是解析一些数据,我需要使用两个不同的标记来分割字符串。

我正在尝试做的一个例子: 如果data = "(I want) some ice cream"。然后我想在(I want)之后将字符串拆分。 与此同时,我可能会得到data = "I want some ice cream"。在这种情况下,我想在I之后将字符串拆分。

我面临的问题是我无法使用第一个空格作为找到分离位置的可靠方式,因为(I want)中有一个空格。

使用此处http://www.regular-expressions.info/conditional.html中的概念,我想创建一个If-Then-Else正则表达式,其中包含关于字符串是否以(开头的后视图。

这是我到目前为止所拥有的:

(?(?<=(^\())(^(.*?)\)|^(.*?)( ))

如果字符串以"("开头,则匹配到第一个)。其他比赛直到第一个空间。 但是,这不起作用。

2 个答案:

答案 0 :(得分:1)

  

如果字符串以(开头,则匹配到第一个)。其他比赛直到第一个空间。这不起作用..

我真的认为没有必要在这里使用If - Then - Else条件,你可以这样做。

^((?:\([^)]*\)|\S+))

正则表达式:

^              the beginning of the string
(              group and capture to \1:
 (?:           group, but do not capture:
  \(           '('
  [^)]*        any character except: ')' (0 or more times)
  \)           ')'
   |           OR
   \S+         non-whitespace (all but \n, \r, \t, \f, and " ") 
  )            end of grouping
 )             end of \1

请参阅Live demo

答案 1 :(得分:1)

你的断言在这里是错误的,因为你没有被实际移动到第一个括号上。这样的事情更合适。

 # ^((?:\([^)]*\)|\S*))


 ^ 
 (                             # (1)
      (?:
           \( [^)]* \)
        |  \S* 
      )
 )

因为它位于字符串的开头,所以如果它是一个条件,它应该是一个先行断言条件。

 #  ^((?(?=\()\([^)]*\)|\S*))

      ^ 
 1    (
 c         (?(?= \( )
                \( [^)]* \)    # yes, its a parenth, match '(..)'
             |  
                \S*            # no, match until first space
           )
 1    )

对于@hwnd。我喜欢你评论的正则表达式,我想通过RegexFormat app看到它。
(看起来不错!!)

 ^                # the beginning of the string
 (                # (1 start), group and capture to \1:
      (?:              # group, but do not capture:
           \(               # '('
           [^)]*            # any character except: ')' (0 or more times)
           \)               # ')'
        |                   # OR
           \S+              # non-whitespace (all but \n, \r, \t, \f, and " ") 
      )                # end of grouping
 )                # (1 end), end of \1