1

我正在做 Python 挑战,虽然我想出了一个谜题的答案,但我以一种 hacky、不是很好的方式完成了它。在推进时,我能够看到解决方案:

string1 = open('text.txt').read()
print ''.join(re.findall('[^A-Z][A-Z]{3}([a-z])[A-Z]{3}[^A-Z]', string1))

我把这个搞砸了一段时间,在这里删除一个插入符号,看看会发生什么,在那里改变一个支撑组。但是,我只是无法理解为什么会这样。谁能用通俗易懂的方式解释一下?

谢谢!

4

3 回答 3

2

([a-z])捕获一个小写字母。

[A-Z]{3}匹配 3 个大写字母(两边)。

[^A-Z]确保没有第 4 个大写字母(“正好三个”)。

于 2012-06-05T14:06:25.873 回答
2

[^AZ] 不是大写字母的字符

[AZ]{3} 三个大写字母

([az]) 匹配的小写字母

重复前两个。

于 2012-06-05T14:07:25.107 回答
2

我将模式编译为详细以包含内联注释:

pat = re.compile('''
    [^A-Z]    # any character except a capital letter
    [A-Z]{3}  # three capital letters
    (         # the beginning of a capturing group
    [a-z]     # one lowercase letter 
    )         # the end of the group
    [A-Z]{3}  # three capital letters
    [^A-Z]    # any character except a capital letter
    ''', re.VERBOSE)

演示:

>>> re.findall(pat, 'AAAAaBBBbBBBBzzZZZxXXXyYYYYwWWWvABCn')
['x', 'v']
于 2012-06-05T14:09:46.907 回答