我正在尝试形成一个正则表达式,如果它在字符串中,则它将捕获<expression1>
,否则将捕获<expression2>
。
我尝试了以下方式:(IF)(?(1)THEN|ELSE)
,这意味着捕获将是IFTHEN
(如果找到了IF
或ELSE
(如果是{{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
答案 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']