Question: I need a regex statement that will check for three capital letters in a row.

For example, it should match: ABC, aABC, abcABC

But it should not match: AaBbBc, ABCDE

At the moment this is my statement:

```
'[^A-Z]*[A-Z]{3}[^A-Z]*'

```

But this matches ABCDE. What am I doing wrong?

Answer: 
Regex
-----

```
(?<![A-Z])[A-Z]{3}(?![A-Z])

```

Explanation
-----------

I specified a *negative lookbehind* and a *negative lookahead* before and after the middle regex for three capitals in a row, respectively.

This is a better option compared to using a negated character class because it will successfully match even when there are no characters to the left or right of the string.

Online Demonstration
--------------------

[**DEMO**](https://regex101.com/r/rI1tY6/1)

---

As for the Python code, I haven't figured out how to print out the actual matches, but this is the syntax:

Using `re.match`:

```
>>> import re
>>> p = re.compile(r'(?<![A-Z])[A-Z]{3}(?![A-Z])')
>>> s = '''ABC
... aABC
... abcABCabcABCDabcABCDEDEDEDa
... ABCDE'''
>>> result = p.match(s)
>>> result.group()
'ABC'

```

Using `re.search`:

```
>>> import re
>>> p = re.compile(r'(?<![A-Z])[A-Z]{3}(?![A-Z])')
>>> s = 'ABcABCde'
>>> p.search(s).group()
'ABC'

```
You can use this:

```
    '^(?:.*[^A-Z])?[A-Z]{3}(?:[^A-Z].*)?$'

```

Explanation:

* `^`,`$` to match start and end of line.
* `(?:.*[^A-Z])?` to check that the previous character is not capital (if any).