在我开始之前-可能值得一提的是:不必使用Regex解决此技术问题,只是当我开始解决此问题时,我立即想到了Regex,我很想知道是否可以使用正则表达式来解决。
我花了最后几个小时来尝试创建一个执行以下操作的正则表达式。
正则表达式必须匹配一个十个字符长的字符串,iff的前五个字符和最后五个字符是相同的,但每个单独的字符都是相反的。
换句话说,如果您采用前五个字符,则将每个字符的大小写取反,该字符应与字符串的后五个字符匹配。
例如,由于前五个字符和后五个字符相同,因此正则表达式应匹配abCDeABcdE
,但每种情况下匹配的字符都相反。换句话说,flip_case("abCDe") == "ABcdE"
还有一些应该匹配的字符串:
abcdeABCDE
,abcdEABCDe
,zYxWvZyXwV
。
以下是一些不匹配的内容:
abcdeABCDZ
,尽管大小写相反,但字符串本身不匹配。abcdeABCDe
是非常接近的匹配,但不应匹配,因为e
的大小写不是相反的。这是我尝试的第一个正则表达式,这显然是错误的,因为它没有考虑大小写交换过程。
/([a-zA-Z]{5})\1/g
我的下一个问题是,是否可以在正则表达式中进行以下操作,但我一直在阅读一些正则表达式教程,但似乎找不到任何地方。
/([A-Z])[\1+32]/g
这个新的正则表达式(显然不起作用)应该匹配一个大写字母,紧随其后的是其自身加上32-ascii,换句话说,它应该匹配一个大写字母,其后紧接着是小写字母。但是,就我而言,您不能在正则表达式中向反向引用“添加ascii值”。
答案 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...