如果不是regex州

2024-06-28 15:46:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我尝试了一些类似于:(IF)(?(1)THEN|ELSE)的东西,这意味着捕获将是IFTHEN(如果IF被找到)或ELSE(如果IF没有找到)

例如:

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

案例1: 对于字符串:pear33 apple14 apple24 orange22 orange44

结果是:apple14

案例2: 与字符串相反:pear33 apple24 orange22 orange44

结果是:apple24 (因为没有apple1它将捕获apple2\d

我的正则表达式在case1中运行良好,它返回apple14,但是ELSE不起作用。对于case2,我希望它返回apple24


Tags: 字符串ifelse案例thenexpression1expression2apple1
3条回答

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

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

在他回来之前,你可以试试这些(尽管搜索.组()和搜索.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版:在我看来,这是一个更好、更具可扩展性的版本。我知道第二版。不过,这个解决方案可能会导致内存占用,但对于短字符串,它可以正常工作

>>> 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']

编辑:使用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']

用途:

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

IF部分应该是一个前瞻性的,因此当采用ELSE分支时,它不包括在匹配需求中。你知道吗

如果不想重复THEN中的IF表达式,可以使用backreference。你知道吗

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

相关问题 更多 >