【问题标题】:Python RegEx that matches char followed/preceded by same char but uppercase/lowercasePython RegEx 匹配 char 后跟/前跟相同 char 但大写/小写
【发布时间】:2018-12-05 14:08:11
【问题描述】:

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

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

我希望任何 char 后面/前面都有 SAME CHAR 但大写。

【问题讨论】:

  • 您可以使用 (\p{L})(?!\1)(?i:\1) (demo) 使用 PyPi 正则表达式模块,但不能使用 Python re
  • 你知道如何使用python re吗?请您解释一下您的解决方案的作用是什么?
  • 使用 Python re 模块,您将需要使用更简单的 (?i)([^\W\d_])(\1) 并添加更多代码来检查匹配项。
  • 您给Aa 的第二个字符串将与您匹配,它不跟随问题,因为它以大写字母开头。 AA 将匹配然后..
  • @LievenKeersmaekers 不确定您所说的“纯正则表达式”是什么意思。如果您的意思是“仅使用正则表达式的任何风味”,那么不。

标签: python regex


【解决方案1】:

您可以使用 PyPi regex module 进行操作(请注意,它适用于 Java、PCRE(PHP、R、Delphi)、Perl、.NET,但不适用于 ECMAScript(JavaScript、C++ std::regex)、RE2 (Go,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) 条件过滤掉不需要的匹配项。

【讨论】:

  • 谢谢哥们。你太棒了。
【解决方案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))])

【讨论】:

    猜你喜欢
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多