匹配char的Python RegEx,后跟/以相同的char开头,但大写/小写
我正在尝试建立一个正则表达式,它将找到: aA,AA,bB,cC, 但不适合:aB,aa,AA,aC,Ca。
-如果我们忽略小写字母,我们要检查下一个/上一个字母是否是大写字母-如果我们对待大写字母,我们要检查下一个/上一个字母是否是小写字母-大写/小写字母都不能通过正则表达式找到
我希望任何字符都跟在/之前,但必须是大写。
-
您可以使用PyPi
regex模块进行操作(请注意,它将与Java,PCRE(PHP,R,Delphi),Perl,.NET一起使用,但不适用于ECMAScript(JavaScript,C
++std::regex
),RE2(Go,Google Apps Script) ))使用(\p{L})(?!\1)(?i:\1)
查看regex演示及其在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的值的后向引用,但由于它以不区分大小写的方式与之匹配a
,因此可以将两者都匹配A
-但是,前一个提前行排除了具有备用大小写的变体(因为前一个\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演示。
(?i)
-设置整个正则表达式不区分大小写([^\W\d_])
-一封信被捕获到第1组中(\1)
-同样的字母被捕获到第2组(不区分大小写,因此Aa
,aA
,aa
和AA
将匹配)。
该
if x.group(1) != x.group(2)
条件会过滤掉不需要的匹配项。