- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试构建一个正则表达式来捕获 <expression1>
如果它在字符串中,否则捕获 <expression2>
.
我尝试了一些类似的方法:(IF)(?(1)THEN|ELSE)
,这意味着捕获将是 IFTHEN
(如果找到 IF
)或 ELSE
(以防找不到 IF
)
例如:
(apple1\d)(?(1)|apple2\d)
案例一:对于字符串:pear33 apple14 apple24 orange22 orange44
结果将是:apple14
案例2:对比字符串:pear33 apple24 orange22 orange44
结果将是:apple24
(因为没有 apple1
它将捕获 apple2\d
)
我的正则表达式适用于 case1 它返回 apple14
然而ELSE
不起作用。我希望它返回 apple24
对于案例 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']
关于python - If-Then-Else 正则表达式语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55768087/
我是一名优秀的程序员,十分优秀!