Construindo uma Função de Pesquisa Case-Insensitive
Agora que você aprendeu diferentes métodos para comparação case-insensitive, vamos construir uma função de pesquisa prática que pode encontrar palavras em texto, independentemente da caixa.
Criando uma Função de Pesquisa
- No WebIDE, crie um novo arquivo e nomeie-o como
search_function.py.
- Adicione o seguinte código para implementar uma função de pesquisa case-insensitive simples:
def search_text(query, text):
"""
Search for a query in text, ignoring case.
Returns a list of all matching positions.
"""
## Convert both to lowercase for case-insensitive comparison
query_lower = query.lower()
text_lower = text.lower()
found_positions = []
position = 0
## Find all occurrences
while position < len(text_lower):
position = text_lower.find(query_lower, position)
if position == -1: ## No more matches
break
found_positions.append(position)
position += 1 ## Move to the next character
return found_positions
## Example text
sample_text = """
Python is a programming language that lets you work quickly and integrate systems effectively.
python is easy to learn, powerful, and versatile.
Many developers love PYTHON for its simplicity and readability.
"""
## Test search
search_query = "python"
results = search_text(search_query, sample_text)
## Display results
if results:
print(f"Found '{search_query}' at {len(results)} positions: {results}")
## Show each match in context
print("\nMatches in context:")
for pos in results:
## Get some context around the match (10 characters before and after)
start = max(0, pos - 10)
end = min(len(sample_text), pos + len(search_query) + 10)
context = sample_text[start:end]
## Highlight the match by showing the original case from the text
match_original_case = sample_text[pos:pos+len(search_query)]
print(f"...{context.replace(match_original_case, f'[{match_original_case}]')}...")
else:
print(f"No matches found for '{search_query}'")
- Salve o arquivo e execute-o com:
python3 search_function.py
Você deve ver uma saída como:
Found 'python' at 3 positions: [1, 67, 132]
Matches in context:
...[Python] is a pro...
...ctively.
[python] is easy ...
...ers love [PYTHON] for its ...
Isso mostra que nossa função encontrou "Python" em três lugares, independentemente de ter sido escrito como "Python", "python" ou "PYTHON". A função também mostra cada correspondência em seu contexto original, preservando a capitalização original.
Aprimorando a Função de Pesquisa
Vamos aprimorar nossa função para torná-la mais útil, adicionando a opção de contar palavras e lidar com a correspondência de palavras inteiras:
Adicione o seguinte código ao seu arquivo search_function.py:
def count_word_occurrences(word, text, whole_word=False):
"""
Count occurrences of a word in text, ignoring case.
If whole_word=True, only count complete word matches.
"""
word_lower = word.lower()
text_lower = text.lower()
if whole_word:
## Use word boundaries to match whole words only
import re
pattern = r'\b' + re.escape(word_lower) + r'\b'
matches = re.findall(pattern, text_lower)
return len(matches)
else:
## Simple substring counting
return text_lower.count(word_lower)
## Test the enhanced function
test_text = """
Python is great. I love python programming.
This python-script demonstrates case-insensitive searching.
The word "python" appears multiple times as a whole word and as part of other words.
"""
## Count all occurrences (including within words)
count_all = count_word_occurrences("python", test_text)
print(f"Total occurrences of 'python' (including within words): {count_all}")
## Count only whole word occurrences
count_whole = count_word_occurrences("python", test_text, whole_word=True)
print(f"Whole word occurrences of 'python': {count_whole}")
Execute o script novamente:
python3 search_function.py
Você deve ver uma saída adicional:
Total occurrences of 'python' (including within words): 4
Whole word occurrences of 'python': 3
Isso mostra que "python" aparece 4 vezes no total, mas apenas 3 vezes como uma palavra inteira (uma ocorrência está em "python-script", que não é uma correspondência de palavra inteira).
Testando Diferentes Cenários
Vamos adicionar mais um teste para mostrar como nossas funções lidam com diferentes tipos de texto:
## Add more test cases
test_cases = [
("Python programming is fun", "python", "Simple sentence with one occurrence"),
("Python, python, PYTHON!", "python", "Multiple occurrences with different cases"),
("No matches here", "python", "No matches"),
("Python-script and PythonProgram contain python", "python", "Mixed word boundaries")
]
print("\nTesting different scenarios:")
for text, search_word, description in test_cases:
whole_matches = count_word_occurrences(search_word, text, whole_word=True)
all_matches = count_word_occurrences(search_word, text)
print(f"\nScenario: {description}")
print(f"Text: '{text}'")
print(f" - Whole word matches: {whole_matches}")
print(f" - All matches: {all_matches}")
Adicione este código e execute o script novamente:
python3 search_function.py
Você verá uma análise detalhada de como a função lida com diferentes cenários de texto:
Testing different scenarios:
Scenario: Simple sentence with one occurrence
Text: 'Python programming is fun'
- Whole word matches: 1
- All matches: 1
Scenario: Multiple occurrences with different cases
Text: 'Python, python, PYTHON!'
- Whole word matches: 3
- All matches: 3
Scenario: No matches
Text: 'No matches here'
- Whole word matches: 0
- All matches: 0
Scenario: Mixed word boundaries
Text: 'Python-script and PythonProgram contain python'
- Whole word matches: 1
- All matches: 3
Isso demonstra como a comparação case-insensitive pode ser usada em uma função de pesquisa do mundo real, com opções para lidar com diferentes requisitos de pesquisa.
No próximo passo, aplicaremos essas técnicas para criar um aplicativo prático de validação de entrada do usuário.