1

私は Python チャレンジを行っていますが、パズルの答えを見つけている間、私はハッキーであまり良い方法ではありませんでした。先に進むと、次のような解決策を確認できました。

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

インラインコメントを含めるために、パターンを冗長としてコンパイルしました。

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 に答える
2

[^AZ] 大文字ではない文字

[AZ]{3} 3 つの大文字

([az]) 一致する小文字

最初の 2 つを繰り返します。

于 2012-06-05T14:07:25.107 に答える
2

([a-z])1 つの小文字をキャプチャします。

[A-Z]{3}3 つの大文字 (両側) に一致します。

[^A-Z]4 番目の大文字がないことを確認します ( "EXACTLY three" )。

于 2012-06-05T14:06:25.873 に答える