正则表达式向后引用以匹配相反的情况

时间:2018-12-05 06:42:00

标签: python regex

在我开始之前-可能值得一提的是:不必使用Regex解决此技术问题,只是当我开始解决此问题时,我立即想到了Regex,我很想知道是否可以使用正则表达式来解决。


我花了最后几个小时来尝试创建一个执行以下操作的正则表达式。

  

正则表达式必须匹配一个十个字符长的字符串,iff的前五个字符和最后五个字符是相同的,但每个单独的字符都是相反的。

     

换句话说,如果您采用前五个字符,则将每个字符的大小写取反,该字符应与字符串的后五个字符匹配。

例如,由于前五个字符和后五个字符相同,因此正则表达式应匹配abCDeABcdE,但每种情况下匹配的字符都相反。换句话说,flip_case("abCDe") == "ABcdE"

还有一些应该匹配的字符串: abcdeABCDEabcdEABCDezYxWvZyXwV

以下是一些不匹配的内容:

  • abcdeABCDZ,尽管大小写相反,但字符串本身不匹配。
  • abcdeABCDe是非常接近的匹配,但不应匹配,因为e的大小写不是相反的。

这是我尝试的第一个正则表达式,这显然是错误的,因为它没有考虑大小写交换过程。

/([a-zA-Z]{5})\1/g

我的下一个问题是,是否可以在正则表达式中进行以下操作,但我一直在阅读一些正则表达式教程,但似乎找不到任何地方。

/([A-Z])[\1+32]/g

这个新的正则表达式(显然不起作用)应该匹配一个大写字母,紧随其后的是其自身加上32-ascii,换句话说,它应该匹配一个大写字母,其后紧接着是小写字母。但是,就我而言,您不能在正则表达式中向反向引用“添加ascii值”。


而且,奖励指向任何可以回答此问题的人-在这种情况下,已知的字符串长度为10个字符。是否可以创建与任意长度的字符串匹配的正则表达式?

1 个答案:

答案 0 :(得分:2)

您要在Python regex模块中使用以下模式:

^(?=(\p{L})(\p{L})(\p{L})(\p{L})(\p{L}))(?=.*(?!\1)(?i:\1)(?!\2)(?i:\2)(?!\3)(?i:\3)(?!\4)(?i:\4)(?!\5)(?i:\5)$)

请参见regex demo

详细信息

  • ^-字符串的开头
  • (?=(\p{L})(\p{L})(\p{L})(\p{L})(\p{L}))-一个积极的前瞻,具有五个捕获组的序列,分别捕获前五个字母
  • (?=.*(?!\1)(?i:\1)(?!\2)(?i:\2)(?!\3)(?i:\3)(?!\4)(?i:\4)(?!\5)(?i:\5)$)-一个积极的前瞻性,可以确保在字符串的末尾有5个字母,它们与开头捕获的字母相同,但大小写不同。

简而言之,第一个前瞻中的第一个(\p{L})捕获了a中的第一个abcdeABCDE,然后在第二个前瞻中,(?!\1)(?i:\1)确保来自末尾相同(启用了不区分大小写的模式),并且(?!\1)的否定前瞻确保该字母与所捕获的字母不同。

re模块不支持内联修饰符组,因此该表达式不适用于该模块。

Python regex based module demo

import regex
strs = ['abcdeABCDE', 'abcdEABCDe', 'zYxWvZyXwV', 'abcdeABCDZ', 'abcdeABCDe']
rx = r'^(?=(\p{L})(\p{L})(\p{L})(\p{L})(\p{L}))(?=.*(?!\1)(?i:\1)(?!\2)(?i:\2)(?!\3)(?i:\3)(?!\4)(?i:\4)(?!\5)(?i:\5)$)'
for s in strs:
    print("Testing {}...".format(s))
    if regex.search(rx, s):
        print("Matched")

输出:

Testing abcdeABCDE...
Matched
Testing abcdEABCDe...
Matched
Testing zYxWvZyXwV...
Matched
Testing abcdeABCDZ...
Testing abcdeABCDe...