Python正则表达式的lookbehind/lookahead组中的大小写不敏感

Python正则表达式的lookbehind/lookahead组中的大小写不敏感,python,regex,Python,Regex,我知道如何在Python中使匹配大小写敏感,我知道如何使用lookahead/lookbehinds,但如何将两者结合起来 例如,我的文本是 mytext = I LOVE EATING popsicles at home. 我想从这篇文章(我的目标食物)中提取冰棒。这个正则表达式非常有效: import re regex = r'(?<=I\sLOVE\sEATING\s)[a-z0-9]*(?=\sat\shome)' re.search(regex, mytext) 这应该匹配。

我知道如何在Python中使匹配大小写敏感,我知道如何使用lookahead/lookbehinds,但如何将两者结合起来

例如,我的文本是

mytext = I LOVE EATING popsicles at home.
我想从这篇文章(我的目标食物)中提取冰棒。这个正则表达式非常有效:

import re
regex = r'(?<=I\sLOVE\sEATING\s)[a-z0-9]*(?=\sat\shome)'
re.search(regex, mytext)
这应该匹配。但是
“我喜欢在家吃苹果”
不应该匹配,因为
苹果
是大写的

因此,我希望在我的两个lookahead
(?=\sat\shome)
和lookahead
(?中有局部案例不敏感

作为解决方法,您可以使用以下正则表达式:

reg = re.compile(r'(?<=[Ii]\s[Ll][Oo][Vv][Ee]\s[Ee][Aa][Tt][Ii][Nn][Gg]\s)[a-z0-9]*(?=\s[Aa][Tt]\s[Hh][Oo][Mm][Ee])')

print "Case 1: ", reg.findall('I LOVE Eating popsicles at HOME.')

print "Case 2: ", reg.findall('I LOVE EATING popsicles at home.')

print "Case 3: ", reg.findall('I LOVE Eating Popsicles at HOME.')

您可以使用
(?i)
将regex全局设置为不区分大小写,并使用
(?-i:groupcontent)
将组切换为区分大小写:

使用
(?i:…)
可以设置正则表达式a标志(在本例中为
i
本地(内联)用于正则表达式的某些部分

在lookback或lookback中也允许这样的本地标志设置 向前看,同时保留剩余的正则表达式而没有任何选择

我修改了你的代码,所以它会反复编译正则表达式 不同字符串的调用次数为2次:

mytext1 = 'i LOVE eating Apples at HOME.'
mytext2 = 'i LOVE eating apples at HOME.'
pat = re.compile(r'(?<=(?i:I\sLOVE\sEATING\s))[a-z0-9]+(?=(?i:\sAT\sHOME))')
m = pat.search(mytext1)
print('1:', m.group() if m else '** Not found **')
m = pat.search(mytext2)
print('2:', m.group() if m else '** Not found **')

因此,匹配只针对第二个源字符串。

Hmmm…鉴于对话可能被转移到聊天室,我认为您应该将标题更改为类似于,
仅在lookarounds内部使用用例不敏感。
我只能想象,您一定会得到一些答案,人们会误解您的问题注意。好的,现在就开始。@wiktor stribiżew在我的队列中收到了重新打开此任务的请求。询问者似乎得到了一个值得接受的答案,另一位参与者给出了一条评论,建议在重新制定任务后保持此打开状态。由于您似乎是RegEx方面的专家,因此认为将此回复给您会很好:C是否可以重新打开?@IdaEbkes这些都是相同的问题。Lookbehinds是regex模式的一部分。答案完全解决了这个问题,显示了旧版本的解决方法,并为3.6以上的Python版本提供了解决方案。@WiktorStribiżew感谢您的反馈,以dup形式关闭。假设可以考虑添加更多答案o dup,那么。不,它不会在
Python2
re.compile(r'(?i)(?@anubhava)中工作。在Python2中,您可以使用该库(使用2.7.8测试)。
Case 1:  ['popsicles']
Case 2:  ['popsicles']
Case 3:  []
regex = r'(?i)(?<=I\sLOVE\sEATING\s)(?-i:[a-z0-9]*)(?=\sat\shome)'
regex = r'(?<=I\sLOVE\sEATING\s)(?-i:[a-z0-9]*)(?=\sat\shome)'
re.search(regex, mytext, re.I)
mytext1 = 'i LOVE eating Apples at HOME.'
mytext2 = 'i LOVE eating apples at HOME.'
pat = re.compile(r'(?<=(?i:I\sLOVE\sEATING\s))[a-z0-9]+(?=(?i:\sAT\sHOME))')
m = pat.search(mytext1)
print('1:', m.group() if m else '** Not found **')
m = pat.search(mytext2)
print('2:', m.group() if m else '** Not found **')
1: ** Not found **
2: apples