Given a string made up of 3 capital letters, 1 small caps and another 3 capital ones, e.g. AAAaAAA
给定一个由3个大写字母组成的字符串,1个小写字母和3个大写字母,例如AAAAAAA
I can't seem to find a regexp that would find a string which matches a string that has:
我似乎无法找到一个正则表达式,它会找到一个匹配字符串的字符串:
- first 3 capital letters all different
- any small caps letter
- first 2 same capital letters as the very first one
- last capital letter the same as the last capital letter in the first "trio"
前三个大写字母都不同
任何小型大写字母
前两个大写字母与第一个相同
最后一个大写字母与第一个“三重奏”中的最后一个大写字母相同
e.g. A B C a AA C (no spaces)
例如A B C a AA C(无空格)
EDIT:
Turns out I needed something slightly different e.g. ABCaAAC where 'a' is the small caps version of the very fist character, not just any character
结果我需要一些略有不同的东西,例如: ABCaAAC其中'a'是第一个角色的小型大写版本,而不仅仅是任何角色
1 个解决方案
#1
11
The following should work:
以下应该有效:
^([A-Z])(?!.?\1)([A-Z])(?!\2)([A-Z])[a-z]\1\1\3$
For example:
>>> regex = re.compile(r'^([A-Z])(?!.?\1)([A-Z])(?!\2)([A-Z])[a-z]\1\1\3$')
>>> regex.match('ABAaAAA') # fails: first three are not different
>>> regex.match('ABCaABC') # fails: first two of second three are not first char
>>> regex.match('ABCaAAB') # fails: last char is not last of first three
>>> regex.match('ABCaAAC') # matches!
<_sre.SRE_Match object at 0x7fe09a44a880>
Explanation:
^ # start of string
([A-Z]) # match any uppercase character, place in \1
(?!.?\1) # fail if either of the next two characters are the previous character
([A-Z]) # match any uppercase character, place in \2
(?!\2) # fail if next character is same as the previous character
([A-Z]) # match any uppercase character, place in \3
[a-z] # match any lowercase character
\1 # match capture group 1
\1 # match capture group 1
\3 # match capture group 3
$ # end of string
If you want to pull these matches out from a larger chunk of text, just get rid of the ^
and $
and use regex.search()
or regex.findall()
.
如果你想从更大的文本块中拉出这些匹配,只需删除^和$并使用regex.search()或regex.findall()。
You may however find the following approach easier to understand, it uses regex for the basic validation but then uses normal string operations to test all of the extra requirements:
但是,您可能会发现以下方法更容易理解,它使用正则表达式进行基本验证,然后使用常规字符串操作来测试所有额外要求:
def validate(s):
return (re.match(r'^[A-Z]{3}[a-z][A-Z]{3}$', s) and s[4] == s[0] and
s[5] == s[0] and s[-1] == s[2] and len(set(s[:3])) == 3)
>>> validate('ABAaAAA')
False
>>> validate('ABCaABC')
False
>>> validate('ABCaAAB')
False
>>> validate('ABCaAAC')
True
#1
11
The following should work:
以下应该有效:
^([A-Z])(?!.?\1)([A-Z])(?!\2)([A-Z])[a-z]\1\1\3$
For example:
>>> regex = re.compile(r'^([A-Z])(?!.?\1)([A-Z])(?!\2)([A-Z])[a-z]\1\1\3$')
>>> regex.match('ABAaAAA') # fails: first three are not different
>>> regex.match('ABCaABC') # fails: first two of second three are not first char
>>> regex.match('ABCaAAB') # fails: last char is not last of first three
>>> regex.match('ABCaAAC') # matches!
<_sre.SRE_Match object at 0x7fe09a44a880>
Explanation:
^ # start of string
([A-Z]) # match any uppercase character, place in \1
(?!.?\1) # fail if either of the next two characters are the previous character
([A-Z]) # match any uppercase character, place in \2
(?!\2) # fail if next character is same as the previous character
([A-Z]) # match any uppercase character, place in \3
[a-z] # match any lowercase character
\1 # match capture group 1
\1 # match capture group 1
\3 # match capture group 3
$ # end of string
If you want to pull these matches out from a larger chunk of text, just get rid of the ^
and $
and use regex.search()
or regex.findall()
.
如果你想从更大的文本块中拉出这些匹配,只需删除^和$并使用regex.search()或regex.findall()。
You may however find the following approach easier to understand, it uses regex for the basic validation but then uses normal string operations to test all of the extra requirements:
但是,您可能会发现以下方法更容易理解,它使用正则表达式进行基本验证,然后使用常规字符串操作来测试所有额外要求:
def validate(s):
return (re.match(r'^[A-Z]{3}[a-z][A-Z]{3}$', s) and s[4] == s[0] and
s[5] == s[0] and s[-1] == s[2] and len(set(s[:3])) == 3)
>>> validate('ABAaAAA')
False
>>> validate('ABCaABC')
False
>>> validate('ABCaAAB')
False
>>> validate('ABCaAAC')
True