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

时间:2018-12-05 14:08:11

标签: python regex

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

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

我希望任何字符都以相同的CHAR开头/跟随,但大写。

2 个答案:

答案 0 :(得分:4)

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

std::regex

请参见regex demoproof it works in Python

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

该解决方案基于内联修饰符组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:...)或{{1} }。

详细信息

  • (?i)-捕获到第1组的任何字母
  • re.I-如果下一个字符与第1组中捕获的字符完全相同,那么负匹配将使匹配失败,请注意-正则表达式索引仍然紧随(\p{L})捕获的字符之后< / li>
  • (?!\1)-不区分大小写的修饰符组,它包含对组1的值的反向引用,但由于它以不区分大小写的方式与之匹配,因此可以同时匹配(\p{L})(?i:\1)-但是前面的前瞻会排除具有备用大小写的变体(因为前面的a以区分大小写的方式匹配)。

A解决方案如何?

\1中,您不能将模式的一部分设为可选,因为模式的任何部分中的re都使其全部不区分大小写。此外,re不支持修饰符组。

您可以使用类似的

(?i)

请参见Python demo

  • 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)]) -字母被捕获到第1组
  • (?i)-同一字母被捕获到第2组中(不区分大小写,因此([^\W\d_])(\1)AaaA将匹配)。 / li>

aa条件会过滤掉不需要的匹配项。

答案 1 :(得分:0)

这可以通过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))])