If-Then-Else正则表达式语句

时间:2019-04-19 21:32:15

标签: python regex if-statement

我正在尝试形成一个正则表达式,如果它在字符串中,则它将捕获<expression1>,否则将捕获<expression2>

我尝试了以下方式:(IF)(?(1)THEN|ELSE),这意味着捕获将是IFTHEN(如果找到了IFELSE(如果是{{1 }}未找到

例如:

IF

案例1: 字符串:(apple1\d)(?(1)|apple2\d)

结果将是:pear33 apple14 apple24 orange22 orange44

案例2: 相反,字符串:apple14

结果将是:pear33 apple24 orange22 orange44 (由于没有apple24,它将捕获apple1

我的正则表达式适用于case1,它返回apple2\d,但是apple14不起作用。我希望它返回case2的ELSE

3 个答案:

答案 0 :(得分:2)

使用:

(?(?=apple1\d)apple1\d|apple2\d)

IF部分应该是先行的,因此采用ELSE分支时,它不包含在匹配要求中。

如果您不想在IF中重复THEN表达式,则可以使用反向引用。

(?(?=(apple1\d))\1|apple2\d)

答案 1 :(得分:2)

首先,我不确定为什么您需要if-else语句(请参见答案的第2版),但我将尝试提供一些解决方案。

因此,对我来说,@ Barmer的解决方案(If-Then-Else regex statement)给了我error: bad character in group name,尽管我确信适当的调整可能是最佳解决方案。

但是,直到他回来,您都可以尝试使用这些方法(尽管search.group()和search.groups()确实让我感到烦恼,因为它们对捕获组的处理/缺少捕获组)

版本1:基于上述建议的解决方案的超特定版本。我认为这里的解决方案不理想。

>>> import re


>>> string1 = 'pear33 apple14 apple24 orange22 orange44'
>>> string2 = 'pear33 apple24 apple14 orange22 orange44'


>>> re.findall('(?<!apple[12]\d)[\s]+(apple1\d|apple2\d)', string1)
['apple14']
>>> re.findall('(?<!apple[12]\d)[\s]+(apple1\d|apple2\d)', string2)
['apple24']


>>> re.search('(?<!apple[12]\d)[\s]+(apple1\d|apple2\d)', string1).group()
' apple14'
>>> re.search('(?<!apple[12]\d)[\s]+(apple1\d|apple2\d)', string2).group()
' apple24'

版本2和3:在我看来,是更好,更具可扩展性的版本。我不知道版本2是什么。TBH,该解决方案会导致内存占用,但是对于短字符串,它会很好地工作

>>> string1 = 'pear33 apple14 apple24 orange22 orange44'
>>> string2 = 'pear33 apple24 apple14 orange22 orange44'


>>> re.findall('[\S\s]*?(apple[\d]+)[\S\s]*', string1)
['apple14']
>>> re.findall('[\S\s]*?(apple[\d]+)[\S\s]*', string2)
['apple24']


>>> re.findall('(?<!apple\d\d)[\S\s]+?(apple[\d]+)[\S\s]*', string1)
['apple14']
>>> re.findall('(?<!apple\d\d)[\S\s]+?(apple[\d]+)[\S\s]*', string2)
['apple24']

答案 2 :(得分:0)

编辑:使用search()代替findall()

第二个示例:

# with "if then else" in search string
string = 'pear33 if then else apple14'
match = re.search(r'if then|else', string)
print(match.group())

输出:

if then

搜索字符串中没有“ if”

string = 'pear33  then else apple14'
match = re.search(r'if then|else', string)
print(match.group())

输出:

else

第一个示例

import re 
string = 'pear33  apple24 orange22 orange44'
match = re.findall(r'(apple1\d|apple2\d)', string)
print(match)

输出:

['apple24']