我正在尝试建立一个正则表达式,它将发现:
aA,Aa,bB,cC
但不适合:aB,aa,AA,aC,Ca。

-如果我们忽略小写字母,我们要检查下一个/上一个字母是否为大写
-如果我们忽略大写字母,我们要检查下一个/上一个字母是否为小写
-我们的正则表达式不应该找到大写/小写字母

我希望任何字符都跟在/之前,但必须是大写。

最佳答案

您可以使用PyPi regex module进行此操作(请注意,它将与Java,PCRE(PHP,R,Delphi),Perl,.NET一起使用,但不适用于ECMAScript(JavaScript,C ++ std::regex),RE2(转到, Google Apps脚本))使用

(\p{L})(?!\1)(?i:\1)


请参见regex demoproof it works in Python

import regex
rx = r'(\p{L})(?!\1)(?i:\1)'
print([x.group() for x in regex.finditer(rx, ' aA, Aa, bB, cC but not aB, aa, AA, aC, Ca')])
# => ['aA', 'Aa', 'bB', 'cC']


该解决方案基于内联修饰符组(?i:...),其中所有字符均以不区分大小写的方式处理,而其他部分则区分大小写(允许没有其他(?i)re.I)。

细节


(\p{L})-捕获到第1组的任何字母
(?!\1)-如果下一个字符与第1组中捕获的字符完全相同,则负向超前将导致匹配失败-请注意,正则表达式索引仍然紧跟在用(\p{L})捕获的字符之后
(?i:\1)-不区分大小写的修饰符组,其中包含对组1的值的反向引用,但由于它以不区分大小写的方式与之匹配,因此它可以同时匹配aA-但是前面的前瞻排除了带有备用大小写(因为前面的\1以区分大小写的方式匹配)。


re解决方案呢?

re中,不能将模式的一部分作为可选部分,因为模式的任何部分中的(?i)都使其全部不区分大小写。此外,re不支持修饰符组。

您可以使用类似

import re
rx = r'(?i)([^\W\d_])(\1)'
print([x.group() for x in re.finditer(rx, ' aA, Aa, bB, cC but not aB, aa, AA, aC, Ca') if x.group(1) != x.group(2)])


请参见Python demo


(?i)-设置整个正则表达式不区分大小写
([^\W\d_])-字母被捕获到第1组中
(\1)-同一字母被捕获到第2组中(不区分大小写,因此AaaAaaAA将匹配)。


if x.group(1) != x.group(2)条件过滤掉不需要的匹配项。

关于python - 匹配char的Python RegEx,后跟/以相同的char开头,但大写/小写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53634190/

10-16 00:58