Проверка строк Python (Pandas) - инструкции и примеры
Проверка строк в Python и Pandas
Как наиболее эффективно проверить строковые данные в коде на Python и при работе с библиотекой Pandas?
Встроенные методы строк (Python) и их аналоги в Pandas
Самым простым и быстрым способом проверки содержимого строки является использование специализированных методов: isdigit(), isalpha(), isalnum(), isspace(), startswith(), endswith(). Эти методы не требуют импорта дополнительных модулей и работают за линейное время. В Pandas доступны аналоги через аксессор .str: .str.isdigit(), .str.startswith() и т.д.
s = "12345"
result = s.isdigit()
print(result) # Trueобработка больших данных python (обработка больших данных в python)
import pandas as pd
series = pd.Series(["123", "abc", "12a"])
result = series.str.isdigit()
print(result)
# 0 True
# 1 False
# 2 False
# dtype: boolочистка данных python (очистка данных в python)
Как определить, что переменная является строкой?
Используйте функцию isinstance():
value = "текст"
print(isinstance(value, str)) # True
value = 100
print(isinstance(value, str)) # FalsePython подготовка данных (подготовка данных в python)
Как проверить, что строка пустая?
Несколько вариантов: сравнение с пустой строкой, проверка длины, логическое отрицание:
s = ""
print(s == "") # True
print(len(s) == 0) # True
print(not s) # True (но также True для None)Python работа с большими данными (работа с большими данными в python)
# В Pandas с учётом пропусков
series = pd.Series(["", "abc", None])
# .str.len() даёт NaN для None, поэтому дополнительно проверяем isna()
empty_mask = series.str.len() == 0
print(empty_mask)
# 0 True
# 1 False
# 2 False (NaN не равен 0, поэтому False)структурированные данные python (структурированные данные в python)
Как проверить, что строка состоит только из цифр (или только из букв)?
Методы str.isdigit(), str.isdecimal(), str.isnumeric() (отличаются поддержкой разных систем счисления) и str.isalpha(). Для букв и цифр вместе используйте str.isalnum().
print("123".isdigit()) # True
print("12.3".isdigit()) # False
print("abc".isalpha()) # True
print("a1".isalnum()) # Trueгенерация данных python (генерация данных в python)
# Pandas
s = pd.Series(["123", "12.3", "abc"])
print(s.str.isdigit())
# 0 True
# 1 False
# 2 FalsePython код символа (код символа в python)
Как проверить начало или конец строки на совпадение с шаблоном?
Методы startswith() и endswith(). Можно передать кортеж для проверки нескольких вариантов:
url = "https://example.com"
print(url.startswith("https")) # True
print(url.endswith(".com")) # True
# Проверка нескольких суффиксов
print(url.endswith((".com", ".org"))) # Trueкод из файла python (код из файла python)
# Pandas
series = pd.Series(["hello.py", "hello.txt", "hello.doc"])
print(series.str.endswith((".py", ".txt")))
# 0 True
# 1 True
# 2 Falseобработка данных на python (обработка данных на python)
Как проверить наличие подстроки в строке?
Используйте оператор in или метод find():
text = "Привет, мир!"
print("мир" in text) # True
# find() возвращает индекс или -1
print(text.find("мир")) # 8
print(text.find("Java")) # -1обработка символьных данных python (обработка символьных данных в python)
# Pandas .str.contains() с отключённым regex
series = pd.Series(["Привет, мир!", "Hello world"])
print(series.str.contains("мир", regex=False))
# 0 True
# 1 FalsePython преобразование в строку (преобразование в строку в python)
Как выполнить сложную проверку по шаблону (регулярные выражения)?
Модуль re предоставляет функции re.match() (проверка с начала строки), re.search() (поиск в любом месте), re.fullmatch() (совпадение всей строки).
import re
pattern = r"^[A-Za-z]+$"
text = "Hello"
print(re.match(pattern, text)) # match object (truthy)
text2 = "Hello123"
print(re.match(pattern, text2)) # None (falsy)Python как проверить строку (проверка строки в python)
# Pandas: .str.match() для проверки с начала, .str.contains() с regex=True
series = pd.Series(["Hello", "Hello123", "123Hello"])
print(series.str.match(r"^[A-Za-z]+$"))
# 0 True
# 1 False
# 2 Falseкак работать с данными в python (работа с данными в python)
Как обработать пропуски (NaN) при проверке строк в Pandas?
Методы .str.* по умолчанию возвращают NaN для пропущенных значений. Часто требуется получить булев массив без NaN. Используйте параметр na в .str.contains() или заполните fillna():
series = pd.Series(["123", None, "abc"])
# Вариант 1: параметр na=False (только для .str.contains)
print(series.str.contains("123", na=False))
# 0 True
# 1 False
# 2 False
# Вариант 2: заполнить пропуски пустой строкой
print(series.fillna("").str.isdigit())
# 0 True
# 1 False
# 2 False
Расширенные примеры проверки строк
# Пример 1: Комбинированная проверка – непустая строка, только буквы, длина от 3 до 10
import re
def validate_name(s):
if not isinstance(s, str) or not s:
return False
if not re.fullmatch(r'[A-Za-z]{3,10}', s):
return False
return True
tests = ["Alice", "Bob", "A", "Alice123", "", None]
for t in tests:
print(f"{t!r}: {validate_name(t)}")
# Результат:
# 'Alice': True
# 'Bob': False (длина <3? нет, длина 3 – должно быть True, но 'Bob' подходит? [A-Za-z]{3,10} – три буквы, True)
# да, 'Bob' подходит, результат True
# 'A': False (длина меньше 3)
# 'Alice123': False (содержит цифры)
# '': False
# None: False
# Пример 2: Проверка нескольких шаблонов с помощью | в регулярном выражении (Pandas)
import pandas as pd
data = pd.Series(["support@example.com", "admin@site.org", "user@domain.net", "not_an_email"])
# Шаблон для примерного определения email
pattern = r'^[\w.-]+@[\w.-]+\.\w+$'
matches = data.str.contains(pattern, regex=True, na=False)
print(matches)
# 0 True
# 1 True
# 2 True
# 3 False
# Пример 3: Извлечение и проверка с помощью .str.extract()
df = pd.DataFrame({"text": ["ID: 123", "ID: abc", "нет ID"]})
# Извлекаем цифровой идентификатор
extracted = df["text"].str.extract(r'ID:\s*(\d+)', expand=False)
print(extracted)
# 0 123
# 1 NaN
# 2 NaN
# Проверяем, что извлечение успешно
df["has_numeric_id"] = extracted.notna()
print(df)
# text has_numeric_id
# 0 ID: 123 True
# 1 ID: abc False
# 2 нет ID False
# Пример 4: Использование .str.fullmatch() для точного совпадения в Pandas
series = pd.Series(["cat", "catalog", "cat
cat"])
# .str.match() проверяет только начало, fullmatch – всю строку
print(series.str.fullmatch(r'cat'))
# 0 True
# 1 False
# 2 False
# Пример 5: Применение пользовательской функции через .map()
def is_good_string(s):
if pd.isna(s):
return False
# строка должна содержать хотя бы одну букву и хотя бы одну цифру
has_letter = any(c.isalpha() for c in s)
has_digit = any(c.isdigit() for c in s)
return has_letter and has_digit
data = pd.Series(["abc123", "123", "abc", None])
print(data.map(is_good_string))
# 0 True
# 1 False
# 2 False
# 3 False
# Пример 6: Проверка строки на соответствие формату UUID (расширенный regex)
import re
uuid_pattern = r'^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
test_strings = ["550e8400-e29b-41d4-a716-446655440000", "неправильный", ""]
for s in test_strings:
result = bool(re.fullmatch(uuid_pattern, s, re.IGNORECASE))
print(f"{s!r}: {result}")
# Результат:
# '550e8400-e29b-41d4-a716-446655440000': True
# 'неправильный': False
# '': False