Проверка строк Python (Pandas) - инструкции и примеры

Раздел: 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)

Пустая строка (s = "") для методов isdigit() и isalpha() вернёт False. Это не всегда очевидно – если требуется считать пустую строку допустимой, нужна дополнительная проверка на длину.

Как определить, что переменная является строкой?

Используйте функцию isinstance():

value = "текст"
print(isinstance(value, str))  # True

value = 100
print(isinstance(value, str))  # False

Python подготовка данных (подготовка данных в python)

Если переменная может быть None или другого типа, проверка типов обязательна перед вызовом строковых методов, иначе возникнет AttributeError.

Как проверить, что строка пустая?

Несколько вариантов: сравнение с пустой строкой, проверка длины, логическое отрицание:

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)

Оператор not s срабатывает и для None, и для False, что может привести к неверным результатам. В Pandas используйте isna() вместе с проверкой пустой строки.

Как проверить, что строка состоит только из цифр (или только из букв)?

Методы 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    False

Python код символа (код символа в python)

Пустая строка для этих методов даёт False. Строка с пробелом ("123 ") также False. Для проверки наличия только цифр без учёта ведущих/концевых пробелов предварительно удалите их через .strip().

Как проверить начало или конец строки на совпадение с шаблоном?

Методы 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)

Методы чувствительны к регистру. Для игнорирования регистра приведите строку к одному регистру: s.lower().startswith(...).

Как проверить наличие подстроки в строке?

Используйте оператор 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    False

Python преобразование в строку (преобразование в строку в python)

in не позволяет указать позицию поиска; для этого используйте find() с начальным индексом. В Pandas .str.contains() по умолчанию использует регулярные выражения, что может замедлить работу; передавайте regex=False для простого поиска.

Как выполнить сложную проверку по шаблону (регулярные выражения)?

Модуль 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)

Регулярные выражения могут быть медленными на больших данных. Излишнее использование re.compile() не всегда оправдано, но улучшает читаемость при многократном применении. Следите за экранированием спецсимволов.

Как обработать пропуски (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
Если na не задан, результат может содержать NaN, что вызовет ошибки при использовании в индексации. Всегда явно указывайте na или очищайте пропуски.
- столбец dataframe python (работа со столбцом dataframe в pandas)
- Python get url (получение url в python)
- Get data python (получение данных в python)

Расширенные примеры проверки строк

Пример
# Пример 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

Проверка строки в Python - comments

En
Python как проверить строку (python)