O COMO FAZER Expressões Regulares diz que sequências especiais podem ser incluídas em uma classe de caracteres (ênfase minha):
A lista de sequências especiais a seguir não está completa. Para obter uma lista completa de sequências e definições de classe expandidas para padrões de string Unicode, consulte a última parte de Sintaxe de Expressão Regular na referência da Biblioteca Padrão. Em geral, as versões Unicode correspondem a qualquer caractere que esteja na categoria apropriada no banco de dados Unicode.
\d
Corresponde a qualquer dígito decimal; isso é equivalente à classe[0-9]
.
\D
Corresponde a qualquer caractere que não seja um dígito; isso é equivalente à classe[^0-9]
.
\s
Corresponde a qualquer caractere de espaço em branco; isso é equivalente à classe[ \t\n\r\f\v]
.
\S
Corresponde a qualquer caractere que não seja espaço em branco; isso é equivalente à classe[^ \t\n\r\f\v]
.
\w
Corresponde a qualquer caractere alfanumérico; isso é equivalente à classe[a-zA-Z0-9_]
.
\W
Corresponde a qualquer caractere não alfanumérico; isso é equivalente à classe[^a-zA-Z0-9_]
.Essas sequências podem ser incluídas dentro de uma classe de caracteres . Por exemplo,
[\s,.]
é uma classe de caracteres que corresponderá a qualquer caractere de espaço em branco, ou','
ou'.'
.
No entanto, parece que \b
não pode ser usado em uma classe de personagem.
pattern = r'\bcool\b'
text = "cool"
matches = re.finditer(
pattern=pattern,
string=text.strip(),
flags=re.IGNORECASE
)
if matches:
for match in matches:
print(f"match: {match.group(0): <20} start: {match.start():<5} end: {match.end():<5} pos: {match.endpos:<5}")
---
match: cool start: 0 end: 4 pos: 4
pattern = r'[\b\s]cool\b' # <-----
text = "cool"
matches = re.finditer(
pattern=pattern,
string=text.strip(),
flags=re.IGNORECASE
)
if matches:
for match in matches:
print(f"match: {match.group(0): <20} start: {match.start():<5} end: {match.end():<5} pos: {match.endpos:<5}")
---
No match
Por favor, ajude a entender o comportamento. Pode \b
ser usado, por exemplo, porque é considerado backspace na classe de personagem? Então está documentado em algum lugar?
Não é possível incluir um limite de palavra em uma classe de caracteres Python. O
\b
marcador pode ser incluído em uma classe de caracteres, mas significa o caractere de retrocesso, não um limite de palavra. Portanto, o seguinte regex não funciona conforme o esperado:Mas você poderia usar uma alternância em vez da classe de caracteres tentada: