繁体   English   中英

匹配char的Python RegEx,后跟/以相同的char开头,但大写/小写

[英]Python RegEx that matches char followed/preceded by same char but uppercase/lowercase

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

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

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

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

(\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的值的反向引用,但由于它以不区分大小写的方式与组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_]) _ ([^\\W\\d_]) -一个字母被捕获到第1组中
  • (\\1) -同一字母被捕获到第2组中(不区分大小写,因此AaaAaaAA将匹配)。

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

这可以通过re完成:

import re
import string

pattern = re.compile('|'.join([''.join(i) for i in zip(list(string.ascii_lowercase), list(string.ascii_uppercase))])
pattern.search(your_text)

如果您正在寻找一个重复的字母来切换大小写(从上到下或从上到下),则可以使用:

pattern = '|'.join([''.join(i) for i in zip(list(string.ascii_uppercase), list(string.ascii_lowercase))] + [''.join(i) for i in zip(list(string.ascii_lowercase), list(string.ascii_uppercase))])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM