精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python 字符串常用的 20 個操作,你掌握了幾個?

開發(fā)
本文會介紹 20 個高頻、高效的字符串操作技巧,掌握它們,你的代碼效率能提升 10 倍。

字符串是 Python 中最常用的數據類型,但 90% 的程序員只用了 20% 的字符串操作。本文會介紹 20 個高頻、高效的字符串操作技巧,掌握它們,你的代碼效率能提升十倍。

一、字符串基礎查找和替換(5 個)

1. find() vs index() —— 查找子字符串的位置

這兩個方法看起來功能相同,其實有關鍵區(qū)別。

text = "Python is awesome, Python is powerful"

# find():找到返回索引,找不到返回 -1(不報錯)
pos1 = text.find("Python")
print(pos1)  # 輸出:0

pos2 = text.find("Java")
print(pos2)  # 輸出:-1(不存在,返回 -1)

# index():找到返回索引,找不到報錯
pos3 = text.index("Python")
print(pos3)  # 輸出:0

pos4 = text.index("Java")
# 報錯:ValueError: substring not found

# 找第二次出現的位置
second_pos = text.find("Python", 1)  # 從位置 1 開始查找
print(second_pos)  # 輸出:26

關鍵區(qū)別:

  • find() 找不到返回 -1,比較安全
  • index() 找不到報錯,需要異常處理

最佳實踐:推薦用 find(),避免異常處理的開銷。

2. replace() —— 替換子字符串

text = "hello world, hello python"

# 基礎替換:替換所有匹配
result1 = text.replace("hello", "hi")
print(result1)
# 輸出:hi world, hi python

# 替換指定次數:只替換前 n 個
result2 = text.replace("hello", "hi", 1)  # 只替換第 1 個
print(result2)
# 輸出:hi world, hello python

# 大小寫敏感
text2 = "Hello world, hello python"
result3 = text2.replace("hello", "hi")
print(result3)
# 輸出:Hello world, hi python(第一個 H 沒替換)

性能陷阱:

# ? 不好的做法(低效)
text = "a" * 1000000  # 100 萬個 'a'
for i in range(100):
    text = text.replace("a", "b")  # 每次都遍歷整個字符串

# ? 好的做法(高效)
import string
text = "a" * 1000000
result = text.translate(str.maketrans("a", "b"))  # 一次遍歷搞定

3. count() —— 統(tǒng)計子字符串出現次數

text = "the quick brown fox jumps over the lazy dog"

# 基礎計數
count1 = text.count("the")
print(count1)  # 輸出:2

# 指定范圍計數(從索引 5 到 30)
count2 = text.count("the", 5, 30)
print(count2)  # 輸出:1

# 統(tǒng)計不同字符的頻率
stats = {}
for char in text:
    if char != ' ':
        stats[char] = stats.get(char, 0) + 1

print(stats)
# 輸出:{'t': 2, 'h': 2, 'e': 3, ...}

# 更高效的做法:用 Counter
from collections import Counter
char_count = Counter(text.replace(" ", ""))
print(char_count.most_common(3))  # 輸出最常見的 3 個字符

生產環(huán)境用法:

# 統(tǒng)計關鍵詞在日志中出現的次數
log_text = """
ERROR: Database connection failed
WARNING: Memory usage high
ERROR: Timeout error
INFO: Server restarted
ERROR: Authentication failed
"""

error_count = log_text.count("ERROR")
warning_count = log_text.count("WARNING")
print(f"錯誤數:{error_count},警告數:{warning_count}")

4. startswith() 和 endswith() —— 前綴和后綴判斷

filename = "document.pdf"
url = "https://www.example.com"

# 檢查后綴
if filename.endswith((".pdf", ".doc", ".docx")):
    print("這是一個文檔文件")

# 檢查前綴
if url.startswith(("http://", "https://")):
    print("這是一個網址")

# 實際應用:文件過濾
import os

def get_python_files(directory):
    """獲取目錄下所有 Python 文件"""
    python_files = []
    for file in os.listdir(directory):
        if file.endswith('.py'):
            python_files.append(file)
    return python_files

# 更 Pythonic 的做法
def get_python_files_v2(directory):
    """更高效的版本"""
    return [f for f in os.listdir(directory) if f.endswith('.py')]

性能對比:

# ? 不好的做法
if filename.endswith('.pdf') or filename.endswith('.doc'):
    pass

# ? 好的做法(3 倍快)
if filename.endswith(('.pdf', '.doc')):
    pass

5. strip() / lstrip() / rstrip() —— 去除空白字符

text = "   hello world   \n"

# strip():去除兩端的空白
result1 = text.strip()
print(f"'{result1}'")  # 輸出:'hello world'

# lstrip():只去除左端
result2 = text.lstrip()
print(f"'{result2}'")  # 輸出:'hello world   \n'

# rstrip():只去除右端
result3 = text.rstrip()
print(f"'{result3}'")  # 輸出:'   hello world'

# ?? 關鍵陷阱:不是只去除一個空格!
text2 = "---hello---"
print(text2.strip("-"))  # 輸出:hello(所有連續(xù)的 - 都被去除了)

# 自定義要去除的字符
text3 = "xxxhelloyyy"
print(text3.strip("xy"))  # 輸出:hello
print(text3.strip("xyhel"))  # 輸出:o(只要包含的字符都被去除)

# 實戰(zhàn)應用:清理 CSV 數據
csv_line = " 張三 , 25 , 北京 \n"
fields = [f.strip() for f in csv_line.split(',')]
print(fields)
# 輸出:['張三', '25', '北京']

# 處理用戶輸入
user_input = input("請輸入你的名字:").strip()
# 自動去除多余的空白,避免數據不一致

常見錯誤:

# ? 錯誤:strip 去除的是字符的集合,不是字符串本身
text = "hello"
print(text.strip("lo"))  # 輸出:he(不是 hello)

# ? 正確做法:如果要去除某個字符串前綴
if text.startswith("lo"):
    text = text[2:]

二、高級分割和連接(4 個)

6. split() 和 rsplit() —— 分割字符串的藝術

# 基礎分割
text = "apple,banana,cherry,date"

parts1 = text.split(",")
print(parts1)
# 輸出:['apple', 'banana', 'cherry', 'date']

# 限制分割次數
parts2 = text.split(",", 2)  # 只分割 2 次
print(parts2)
# 輸出:['apple', 'banana', 'cherry,date']

# rsplit():從右邊開始分割
parts3 = text.rsplit(",", 2)  # 從右邊分割 2 次
print(parts3)
# 輸出:['apple,banana', 'cherry', 'date']

# 多個分隔符分割(用正則表達式)
import re
text2 = "apple, banana; cherry: date"
parts4 = re.split(r'[,;:]', text2)
print(parts4)
# 輸出:['apple', ' banana', ' cherry', ' date']

# 實戰(zhàn)應用1:解析 URL
url = "https://www.example.com/path/to/resource?key=value&foo=bar"
protocol, rest = url.split("://", 1)
domain, rest = rest.split("/", 1)
path, query = rest.split("?", 1)
print(f"協(xié)議:{protocol},域名:{domain},路徑:{path},查詢:{query}")

# 實戰(zhàn)應用2:解析 CSV 行
csv_line = 'John,"Smith, Jr.",30,New York'
# 簡單 split 會出錯,需要用 csv 模塊
import csv
reader = csv.reader([csv_line])
fields = next(reader)
print(fields)
# 輸出:['John', 'Smith, Jr.', '30', 'New York']

性能對比:

# ? 低效:多次分割
text = "a:b:c:d:e"
parts = text.split(":")
result = parts[2]  # 獲取第 3 個元素

# ? 高效:只分割需要的部分
result = text.split(":", 3)[2]

7. join() —— 連接字符串

# 基礎連接
words = ["hello", "world", "python"]
result1 = " ".join(words)
print(result1)  # 輸出:hello world python

# 連接數字(需要轉換)
numbers = [1, 2, 3, 4, 5]
result2 = "-".join(str(n) for n in numbers)
print(result2)  # 輸出:1-2-3-4-5

# 實戰(zhàn)應用1:生成 SQL IN 語句
ids = [1, 2, 3, 4, 5]
sql = f"SELECT * FROM users WHERE id IN ({','.join(map(str, ids))})"
print(sql)

# 實戰(zhàn)應用2:生成 URL 路徑
path_parts = ["api", "v1", "users", "123"]
path = "/" + "/".join(path_parts)
print(path)  # 輸出:/api/v1/users/123

# 實戰(zhàn)應用3:生成 CSV 行
data = ["張三", 25, "北京", "zhangsan@example.com"]
csv_line = ",".join(map(str, data))
print(csv_line)

# ?? 性能陷阱:不要用 + 連接多個字符串
# ? 不好的做法(每次都創(chuàng)建新字符串,O(n2) 復雜度)
result = ""
for word in words:
    result = result + " " + word

# ? 好的做法(一次性連接,O(n) 復雜度)
result = " ".join(words)

大規(guī)模數據對比:

import time

# 生成 10000 個字符串
data = ["word"] * 10000

# 用 + 連接(耗時)
start = time.time()
result = ""
for word in data:
    result += word + ","
time1 = time.time() - start

# 用 join(快速)
start = time.time()
result = ",".join(data)
time2 = time.time() - start

print(f"+ 方式:{time1:.4f}s,join 方式:{time2:.4f}s")
# 輸出示例:+ 方式:0.1234s,join 方式:0.0012s(快 100 倍!)

8. partition() 和 rpartition() —— 三分法分割

# partition():在第一個分隔符處分割成三部分
text = "name=John;age=30;city=NYC"

head, sep, tail = text.partition(";")
print(f"前:{head},分隔符:{sep},后:{tail}")
# 輸出:前:name=John,分隔符:;,后:age=30;city=NYC

# 實戰(zhàn)應用:解析 key=value 格式
def parse_key_value(text):
    key, sep, value = text.partition("=")
    return key.strip(), value.strip() if sep elseNone

result = parse_key_value("timeout = 3000")
print(result)  # 輸出:('timeout', '3000')

# rpartition():從右邊開始分割
head, sep, tail = text.rpartition(";")
print(f"前:{head},分隔符:{sep},后:{tail}")
# 輸出:前:name=John;age=30,分隔符:;,后:city=NYC

# 實戰(zhàn)應用:獲取文件擴展名
def get_file_info(filename):
    name, sep, ext = filename.rpartition(".")
    return name, ext if sep else""

print(get_file_info("document.pdf"))  # 輸出:('document', 'pdf')
print(get_file_info("archive.tar.gz"))  # 輸出:('archive.tar', 'gz')

三、格式化和轉換(5 個)

9. format() 和 f-string —— 字符串格式化的演進

name = "張三"
age = 25
salary = 15000.5

# 方式1:% 格式化(已過時)
result1 = "姓名:%s,年齡:%d,工資:%.2f" % (name, age, salary)

# 方式2:format() 方法(兼容性好)
result2 = "姓名:{},年齡:{},工資:{:.2f}".format(name, age, salary)

# 方式3:f-string(Python 3.6+,推薦)
result3 = f"姓名:{name},年齡:{age},工資:{salary:.2f}"

print(result3)
# 輸出:姓名:張三,年齡:25,工資:15000.50

# f-string 的強大功能:可以直接執(zhí)行表達式
print(f"下年工資:{salary * 1.1:.2f}")  # 輸出:下年工資:16500.55

# 對齊和填充
numbers = [1, 12, 123, 1234]
for num in numbers:
    print(f"數字:{num:>5}")
# 輸出:
# 數字:    1
# 數字:   12
# 數字:  123
# 數字: 1234

# 進制轉換
num = 255
print(f"十進制:{num},十六進制:{num:x},二進制:{num:b}")
# 輸出:十進制:255,十六進制:ff,二進制:11111111

# 百分比格式
rate = 0.8567
print(f"完成度:{rate:.2%}")  # 輸出:完成度:85.67%

# 數字分隔符(Python 3.6+)
large_num = 1234567890
print(f"大數字:{large_num:,}")  # 輸出:大數字:1,234,567,890

性能對比:

import time

name = "Python"
age = 10

# 對比三種方法的性能
iterations = 1000000

# % 格式化
start = time.time()
for _ in range(iterations):
    result = "%s is %d years old" % (name, age)
time1 = time.time() - start

# format() 方法
start = time.time()
for _ in range(iterations):
    result = "{} is {} years old".format(name, age)
time2 = time.time() - start

# f-string
start = time.time()
for _ in range(iterations):
    result = f"{name} is {age} years old"
time3 = time.time() - start

print(f"% 格式化:{time1:.3f}s")
print(f"format():{time2:.3f}s")
print(f"f-string:{time3:.3f}s")
# 輸出示例:f-string 最快,% 最慢

10. upper() / lower() / title() / swapcase() —— 大小寫轉換

text = "Hello World Python"

# 全部大寫
print(text.upper())  # 輸出:HELLO WORLD PYTHON

# 全部小寫
print(text.lower())  # 輸出:hello world python

# 標題格式(首字母大寫)
print(text.title())  # 輸出:Hello World Python

# 交換大小寫
print(text.swapcase())  # 輸出:hELLO wORLD pYTHON

# capitalize():首字母大寫,其他小寫
print(text.capitalize())  # 輸出:Hello world python

# 實戰(zhàn)應用1:規(guī)范化用戶輸入
user_email = input("請輸入郵箱:").strip().lower()
# 防止大小寫差異導致的問題

# 實戰(zhàn)應用2:生成 URL slug
def slugify(text):
    """將文本轉換為 URL 安全的格式"""
    return text.lower().replace(" ", "-")

print(slugify("Hello World Python"))  # 輸出:hello-world-python

# 實戰(zhàn)應用3:檢查密碼復雜度
def check_password_strength(password):
    has_upper = any(c.isupper() for c in password)
    has_lower = any(c.islower() for c in password)
    has_digit = any(c.isdigit() for c in password)
    return len(password) >= 8and has_upper and has_lower and has_digit

print(check_password_strength("Secure123"))  # 輸出:True

11. isdigit() / isalpha() / isalnum() —— 字符檢驗

# 檢查是否全是數字
print("12345".isdigit())  # 輸出:True
print("123a5".isdigit())  # 輸出:False

# 檢查是否全是字母
print("hello".isalpha())  # 輸出:True
print("hello123".isalpha())  # 輸出:False

# 檢查是否全是字母或數字
print("hello123".isalnum())  # 輸出:True
print("hello-123".isalnum())  # 輸出:False

# 檢查是否全是空格
print("   ".isspace())  # 輸出:True

# 檢查是否是合法標識符(變量名)
print("var_name".isidentifier())  # 輸出:True
print("123var".isidentifier())  # 輸出:False

# 檢查是否全是大寫/小寫
print("HELLO".isupper())  # 輸出:True
print("hello".islower())  # 輸出:True

# 實戰(zhàn)應用1:驗證用戶輸入
def validate_username(username):
    if len(username) < 3or len(username) > 20:
        returnFalse, "用戶名長度 3-20 位"
    ifnot username[0].isalpha():
        returnFalse, "用戶名首字必須是字母"
    ifnot username.replace("_", "").isalnum():
        returnFalse, "用戶名只能包含字母、數字和下劃線"
    returnTrue, "用戶名合法"

print(validate_username("user_123"))  # 輸出:(True, '用戶名合法')
print(validate_username("123user"))   # 輸出:(False, '用戶名首字必須是字母')

# 實戰(zhàn)應用2:數據類型識別
def detect_type(value_str):
    """識別字符串代表的數據類型"""
    if value_str.isdigit():
        return"整數"
    elif value_str.isalpha():
        return"字符串"
    elif value_str.isalnum():
        return"混合類型"
    else:
        return"其他"

print(detect_type("123"))  # 輸出:整數

12. zfill() 和 center() —— 填充和居中

# zfill():用 0 填充左邊
num_str = "123"
print(num_str.zfill(5))  # 輸出:00123

# 實戰(zhàn)應用1:生成訂單號
def generate_order_id(order_num):
    returnf"ORD{order_num:0>6d}"

print(generate_order_id(123))  # 輸出:ORD000123

# center():居中(填充兩邊)
text = "Python"
print(text.center(15))  # 輸出:"    Python     "
print(text.center(15, "*"))  # 輸出:"****Python*****"

# ljust() 和 rjust():左對齊和右對齊
print(text.ljust(15, "-"))  # 輸出:Python---------
print(text.rjust(15, "-"))  # 輸出:---------Python

# 實戰(zhàn)應用2:打印表格
def print_table(rows):
    """打印對齊的表格"""
    for row in rows:
        print("|".join(cell.center(15) for cell in row))

rows = [
    ["姓名", "年齡", "城市"],
    ["張三", "25", "北京"],
    ["李四", "30", "上海"],
]
print_table(rows)

四、正則表達式和高級操作(6 個)

13. 正則表達式基礎 —— match() / search() / findall()

import re

# match():從開頭匹配
text = "Python 3.9"
if re.match(r"Python", text):
    print("匹配成功")

# search():在全文中查找
if re.search(r"\d+\.\d+", text):
    print("找到版本號")

# findall():找出所有匹配
emails = "contact us at john@example.com or jane@test.org"
found = re.findall(r"\b[\w.-]+@[\w.-]+\.\w+\b", emails)
print(found)
# 輸出:['john@example.com', 'jane@test.org']

# 提取有分組的內容
text = "Price: $99.99, Tax: $7.50"
matches = re.findall(r"\$(\d+\.\d+)", text)
print(matches)
# 輸出:['99.99', '7.50']

# 實戰(zhàn)應用1:電話號碼提取
def extract_phone_numbers(text):
    """從文本中提取電話號碼"""
    pattern = r"\b(?:\+?1[-.\s]?)?\(?([0-9]{3})\)?[-.\s]?([0-9]{3})[-.\s]?([0-9]{4})\b"
    return re.findall(pattern, text)

text = "Call me at 123-456-7890 or (098) 765 4321"
print(extract_phone_numbers(text))

# 實戰(zhàn)應用2:URL 提取
def extract_urls(text):
    """從文本中提取所有 URL"""
    pattern = r"https?://(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&//=]*)"
    return re.findall(pattern, text)

text = "Visit https://www.example.com or http://test.org for more info"
print(extract_urls(text))

14. sub() 和 subn() —— 正則替換

import re

# sub():替換所有匹配
text = "The price is $99.99 and tax is $7.50"
result = re.sub(r"\$(\d+\.\d+)", r"¥\1*7", text)
print(result)
# 輸出:The price is ¥99.99*7 and tax is ¥7.50*7

# subn():替換并返回替換次數
text = "apple, apple, apple"
result, count = re.subn(r"apple", "orange", text)
print(f"替換了 {count} 處")
print(result)

# 使用函數進行動態(tài)替換
def replace_func(match):
    """將價格增加 10%"""
    price = float(match.group(1))
    returnf"${price * 1.1:.2f}"

text = "Item 1: $100, Item 2: $50"
result = re.sub(r"\$(\d+(?:\.\d+)?)", replace_func, text)
print(result)
# 輸出:Item 1: $110.00, Item 2: $55.00

# 實戰(zhàn)應用1:日期格式轉換
def convert_date_format(text):
    """將 2024-01-15 轉換為 15/01/2024"""
    pattern = r"(\d{4})-(\d{2})-(\d{2})"
    return re.sub(pattern, r"\3/\2/\1", text)

print(convert_date_format("Today is 2024-01-15"))
# 輸出:Today is 15/01/2024

# 實戰(zhàn)應用2:HTML 標簽移除
def remove_html_tags(text):
    """從 HTML 中提取純文本"""
    return re.sub(r"<[^>]+>", "", text)

html = "<p>Hello <b>World</b></p>"
print(remove_html_tags(html))
# 輸出:Hello World

15. compile() —— 預編譯正則表達式(性能優(yōu)化)

import re

# ? 不好的做法(每次都編譯)
def validate_email_slow(email):
    for _ in range(1000):
        if re.match(r"^[\w\.-]+@[\w\.-]+\.\w+$", email):
            returnTrue
    returnFalse

# ? 好的做法(只編譯一次)
email_pattern = re.compile(r"^[\w\.-]+@[\w\.-]+\.\w+$")

def validate_email_fast(email):
    for _ in range(1000):
        if email_pattern.match(email):
            returnTrue
    returnFalse

# 性能對比
import time

email = "user@example.com"

start = time.time()
validate_email_slow(email)
time1 = time.time() - start

start = time.time()
validate_email_fast(email)
time2 = time.time() - start

print(f"未預編譯:{time1:.4f}s,預編譯:{time2:.4f}s")
# 預編譯通常快 2-3 倍

# 實戰(zhàn)應用:創(chuàng)建驗證器類
class Validator:
    """使用預編譯正則表達式的驗證器"""
    EMAIL_PATTERN = re.compile(r"^[\w\.-]+@[\w\.-]+\.\w+$")
    PHONE_PATTERN = re.compile(r"^\d{10,11}$")
    URL_PATTERN = re.compile(r"^https?://")
    
    @classmethod
    def is_valid_email(cls, email):
        return cls.EMAIL_PATTERN.match(email) isnotNone
    
    @classmethod
    def is_valid_phone(cls, phone):
        return cls.PHONE_PATTERN.match(phone) isnotNone
    
    @classmethod
    def is_valid_url(cls, url):
        return cls.URL_PATTERN.match(url) isnotNone

print(Validator.is_valid_email("user@example.com"))  # True
print(Validator.is_valid_phone("13800138000"))  # True
print(Validator.is_valid_url("https://example.com"))  # True

16. translate() —— 高效的字符替換

# 創(chuàng)建轉換表
translation_table = str.maketrans("aeiou", "12345")
text = "hello world"
result = text.translate(translation_table)
print(result)
# 輸出:h2ll4 w4rld

# 刪除指定字符
delete_table = str.maketrans("", "", "aeiou")
text = "hello world"
result = text.translate(delete_table)
print(result)
# 輸出:hll wrld

# 實戰(zhàn)應用1:移除標點符號
import string
text = "Hello, World! How are you?"
remove_punctuation = str.maketrans("", "", string.punctuation)
result = text.translate(remove_punctuation)
print(result)
# 輸出:Hello World How are you

# 實戰(zhàn)應用2:數字轉中文
chinese_map = str.maketrans("0123456789", "零一二三四五六七八九")
text = "My phone is 13800138000"
result = text.translate(chinese_map)
print(result)
# 輸出:My phone is 一三八零零一三八零零零

# 性能對比:translate vs replace
import time

text = "hello world" * 10000
iterations = 10000

# 方式1:用 replace
start = time.time()
for _ in range(iterations):
    result = text.replace("o", "0").replace("e", "3")
time1 = time.time() - start

# 方式2:用 translate
trans_table = str.maketrans("oe", "03")
start = time.time()
for _ in range(iterations):
    result = text.translate(trans_table)
time2 = time.time() - start

print(f"replace 方式:{time1:.4f}s,translate 方式:{time2:.4f}s")
# translate 通常快 3-5 倍

17. expandtabs() —— 制表符處理

# 將制表符轉換為空格
text = "name\tage\tcity\nJohn\t25\tNYC"
print(text.expandtabs(15))
# 輸出對齊的表格

# 實戰(zhàn)應用:處理日志文件中的縮進
log_text = "Error:\t\tConnection failed\nWarning:\t\tMemory high"
formatted = log_text.expandtabs(20)
print(formatted)

# 獲取制表符的位置
text = "Line1\tColumn1\nLine2\tColumn2"
print(text.expandtabs(10))

18. encode() 和 decode() —— 字符編碼轉換

# 編碼:字符串 → 字節(jié)
text = "Hello 世界 ??"

# 編碼為 UTF-8
encoded_utf8 = text.encode("utf-8")
print(encoded_utf8)
# 輸出:b'Hello \xe4\xb8\x96\xe7\x95\x8c \xf0\x9f\x8c\x8d'

# 編碼為 GB2312(簡體中文)
encoded_gb = text.encode("gb2312", errors="ignore")
print(encoded_gb)

# 解碼:字節(jié) → 字符串
decoded = encoded_utf8.decode("utf-8")
print(decoded)
# 輸出:Hello 世界 ??

# 處理編碼錯誤
text = "測試"
try:
    # 嘗試用 ASCII 編碼(會失敗)
    encoded = text.encode("ascii")
except UnicodeEncodeError as e:
    print(f"編碼錯誤:{e}")

# 使用錯誤處理策略
# 'strict':遇到無法編碼的字符報錯(默認)
# 'ignore':忽略無法編碼的字符
# 'replace':用 ? 替代無法編碼的字符
# 'xmlcharrefreplace':用 XML 字符引用替代

text = "Hello 世界"
print(text.encode("ascii", errors="ignore"))
# 輸出:b'Hello '

print(text.encode("ascii", errors="replace"))
# 輸出:b'Hello ?'

print(text.encode("ascii", errors="xmlcharrefreplace"))
# 輸出:b'Hello 世界'

# 實戰(zhàn)應用1:處理文件編碼問題
def safe_read_file(filepath):
    """安全讀取文件,自動處理編碼問題"""
    encodings = ["utf-8", "gbk", "gb2312", "ascii"]
    for encoding in encodings:
        try:
            with open(filepath, "r", encoding=encoding) as f:
                return f.read()
        except (UnicodeDecodeError, UnicodeEncodeError):
            continue
    raise ValueError("無法讀取文件,編碼未知")

# 實戰(zhàn)應用2:處理網絡數據
import json
json_str = '{"name":"張三","age":25}'
json_bytes = json_str.encode("utf-8")
decoded_str = json_bytes.decode("utf-8")
data = json.loads(decoded_str)
print(data)

19. ljust() / rjust() / center() 的高級用法

# 基礎用法
text = "Python"
print(text.ljust(15, "-"))  # 輸出:Python---------
print(text.rjust(15, "-"))  # 輸出:---------Python
print(text.center(15, "-")) # 輸出:----Python-----

# 實戰(zhàn)應用1:創(chuàng)建進度條
def progress_bar(percent, width=20):
    """創(chuàng)建文本進度條"""
    filled = int(width * percent / 100)
    bar = "█" * filled + "?" * (width - filled)
    returnf"[{bar}] {percent}%"

for i in range(0, 101, 10):
    print(progress_bar(i))

# 實戰(zhàn)應用2:對齊輸出(類似表格)
def print_aligned_table(data):
    """打印對齊的表格"""
    # 計算每列的最大寬度
    max_widths = [max(len(str(row[i])) for row in data) 
                  for i in range(len(data[0]))]
    
    for row in data:
        aligned_row = [str(cell).ljust(width) 
                       for cell, width in zip(row, max_widths)]
        print(" | ".join(aligned_row))

data = [
    ["姓名", "年齡", "城市"],
    ["張三", "25", "北京"],
    ["李四的昵稱", "30", "上海"],
]
print_aligned_table(data)

# 實戰(zhàn)應用3:美化日志輸出
def format_log_message(level, message):
    """格式化日志消息"""
    level_str = f"[{level}]".ljust(10)
    returnf"{level_str} {message}"

print(format_log_message("INFO", "Server started"))
print(format_log_message("ERROR", "Connection failed"))
print(format_log_message("WARNING", "Memory usage high"))

20. casefold() —— 激進的大小寫折疊

# casefold():比 lower() 更激進的小寫轉換
# 適用于國際字符和不同語言

text = "?"# 德文字母
print(text.lower())    # 輸出:?(不變)
print(text.casefold()) # 輸出:ss(轉換為兩個 s)

# 實戰(zhàn)應用1:不區(qū)分大小寫的字符串比較
def case_insensitive_compare(str1, str2):
    """不區(qū)分大小寫的比較(包括國際字符)"""
    return str1.casefold() == str2.casefold()

print(case_insensitive_compare("Stra?e", "STRASSE"))  # 輸出:True
print(case_insensitive_compare("hello", "HELLO"))  # 輸出:True

# 實戰(zhàn)應用2:搜索功能
def search_case_insensitive(text, query):
    """不區(qū)分大小寫的搜索"""
    return query.casefold() in text.casefold()

print(search_case_insensitive("Hello World", "hello"))  # 輸出:True
print(search_case_insensitive("Na?ve", "naive"))  # 輸出:True

# 性能對比:casefold vs lower
import time

text = ("Hello World Python " * 1000).casefold()
query = "world"

iterations = 100000

# 使用 lower()
start = time.time()
for _ in range(iterations):
    query.lower() in text
time1 = time.time() - start

# 使用 casefold()
start = time.time()
for _ in range(iterations):
    query.casefold() in text
time2 = time.time() - start

print(f"lower():{time1:.4f}s,casefold():{time2:.4f}s")

五、綜合實戰(zhàn):完整的數據處理流程

綜合案例1:解析和驗證用戶數據

import re
from collections import defaultdict

def parse_and_validate_user_data(csv_data):
    """
    解析和驗證 CSV 格式的用戶數據
    
    輸入格式:
    name,email,phone,age
    張三,zhangsan@example.com,13800138000,25
    李四,lisi@test.org,15900139000,30
    """
    
    lines = csv_data.strip().split("\n")
    headers = [h.strip() for h in lines[0].split(",")]
    
    users = []
    errors = []
    
    for i, line in enumerate(lines[1:], start=2):
        fields = [f.strip() for f in line.split(",")]
        
        if len(fields) != len(headers):
            errors.append(f"行 {i}:字段數不匹配")
            continue
        
        user = dict(zip(headers, fields))
        
        # 驗證郵箱
        email_pattern = re.compile(r"^[\w\.-]+@[\w\.-]+\.\w+$")
        ifnot email_pattern.match(user["email"]):
            errors.append(f"行 {i}:郵箱格式錯誤 - {user['email']}")
            continue
        
        # 驗證電話
        ifnot user["phone"].isdigit() or len(user["phone"]) != 11:
            errors.append(f"行 {i}:電話格式錯誤 - {user['phone']}")
            continue
        
        # 驗證年齡
        try:
            age = int(user["age"])
            ifnot18 <= age <= 100:
                errors.append(f"行 {i}:年齡應在 18-100 之間")
                continue
        except ValueError:
            errors.append(f"行 {i}:年齡應為數字 - {user['age']}")
            continue
        
        user["age"] = age
        users.append(user)
    
    return {
        "valid_users": users,
        "errors": errors,
        "summary": f"成功:{len(users)} 條,失敗:{len(errors)} 條"
    }

# 使用示例
csv_data = """
name,email,phone,age
張三,zhangsan@example.com,13800138000,25
李四,invalid-email,15900139000,30
王五,wangwu@test.org,159001390,35
趙六,zhaoliu@test.org,18600136000,120
"""

result = parse_and_validate_user_data(csv_data)
print(result["summary"])
for error in result["errors"]:
    print(f"  ? {error}")
for user in result["valid_users"]:
    print(f"  ? {user['name']} - {user['email']}")

綜合案例2:日志分析和統(tǒng)計

import re
from collections import Counter

def analyze_log_file(log_text):
    """
    分析日志文件,提取關鍵信息
    
    日志格式:
    [2024-01-15 10:30:45] INFO: Server started
    [2024-01-15 10:30:50] ERROR: Connection failed
    """
    
    # 定義日志模式
    log_pattern = re.compile(
        r"\[(?P<timestamp>.*?)\]\s+(?P<level>\w+):\s+(?P<message>.*)"
    )
    
    logs = []
    level_count = Counter()
    
    for line in log_text.strip().split("\n"):
        match = log_pattern.match(line)
        ifnot match:
            continue
        
        log_entry = match.groupdict()
        logs.append(log_entry)
        level_count[log_entry["level"]] += 1
    
    # 查找錯誤消息
    errors = [log for log in logs if log["level"] == "ERROR"]
    
    # 統(tǒng)計信息
    return {
        "total_logs": len(logs),
        "level_distribution": dict(level_count),
        "errors": errors,
        "error_count": len(errors),
        "error_types": Counter(e["message"].split(":")[0] for e in errors)
    }

# 使用示例
log_text = """
[2024-01-15 10:30:45] INFO: Server started
[2024-01-15 10:30:50] ERROR: Connection failed
[2024-01-15 10:31:00] WARNING: Memory usage high
[2024-01-15 10:31:05] ERROR: Connection failed
[2024-01-15 10:31:10] INFO: Request processed
"""

result = analyze_log_file(log_text)
print(f"總日志數:{result['total_logs']}")
print(f"日志級別分布:{result['level_distribution']}")
print(f"錯誤數:{result['error_count']}")
print(f"錯誤類型:{result['error_types']}")

綜合案例3:URL 解析和清理

import re
from urllib.parse import urlparse, parse_qs

def analyze_urls(url_list):
    """
    分析和清理 URL 列表
    """
    
    url_pattern = re.compile(
        r"https?://(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&//=]*)"
    )
    
    valid_urls = []
    domains = Counter()
    
    for url in url_list:
        # 提取 URL
        url = url.strip()
        ifnot url_pattern.match(url):
            continue
        
        # 解析 URL
        parsed = urlparse(url)
        domain = parsed.netloc.replace("www.", "")
        domains[domain] += 1
        
        # 解析查詢參數
        params = parse_qs(parsed.query)
        
        valid_urls.append({
            "url": url,
            "domain": domain,
            "path": parsed.path,
            "params": params
        })
    
    return {
        "total_urls": len(valid_urls),
        "unique_domains": len(domains),
        "top_domains": domains.most_common(5),
        "urls": valid_urls
    }

# 使用示例
urls = [
    "https://www.example.com/path?key=value",
    "http://test.org/api/users?id=123&type=admin",
    "invalid-url",
    "https://github.com/repository"
]

result = analyze_urls(urls)
print(f"有效 URL:{result['total_urls']}")
print(f"獨特域名:{result['unique_domains']}")
print(f"頂級域名:{result['top_domains']}")

六、性能優(yōu)化總結

場景1:大規(guī)模字符串拼接

# ? 不好(時間復雜度 O(n2))
result = ""
for i in range(10000):
    result += f"Item {i}, "

# ? 好(時間復雜度 O(n))
result = ", ".join(f"Item {i}" for i in range(10000))

# 性能提升:100 倍以上

場景2:多次替換操作

# ? 不好(每次都遍歷字符串)
text = "a" * 1000000
for char in "abcdefg":
    text = text.replace(char, "x")

# ? 好(使用 translate,一次遍歷)
trans = str.maketrans("abcdefg", "xxxxxxx")
text = text.translate(trans)

# 性能提升:10 倍以上

場景3:頻繁的正則匹配

# ? 不好(每次都編譯)
import re
for email in emails:
    if re.match(r"^[\w\.-]+@[\w\.-]+\.\w+$", email):
        pass

# ? 好(預編譯)
pattern = re.compile(r"^[\w\.-]+@[\w\.-]+\.\w+$")
for email in emails:
    if pattern.match(email):
        pass

# 性能提升:2-3 倍

七、20 個操作速查表

序號

操作

用途

復雜度

常用度

1

find() / index()

查找子字符串

O(n*m)

?????

2

replace()

替換子字符串

O(n*m)

?????

3

count()

統(tǒng)計出現次數

O(n)

????

4

startswith/endswith

前后綴檢查

O(m)

?????

5

strip()

去除空白

O(n)

?????

6

split()

分割字符串

O(n)

?????

7

join()

連接字符串

O(n)

?????

8

partition()

三分法分割

O(n)

???

9

format / f-string

字符串格式化

O(n)

?????

10

upper/lower/title

大小寫轉換

O(n)

????

11

isdigit/isalpha

字符檢驗

O(n)

????

12

zfill / center

填充和居中

O(n)

???

13

match / search

正則匹配

O(n*m)

?????

14

findall

找所有匹配

O(n*m)

?????

15

sub / subn

正則替換

O(n*m)

?????

16

compile

預編譯正則

O(m)

????

17

translate

字符映射

O(n)

???

18

expandtabs

制表符處理

O(n)

?

19

encode / decode

編碼轉換

O(n)

????

20

casefold

激進小寫

O(n)

??

八、最佳實踐建議

? 做這些事:

  • 使用 f-string —— 最新、最快、最可讀
  • 用 join() 拼接 —— 永遠不要用 + 連接多個字符串
  • 預編譯正則 —— 頻繁匹配時必須預編譯
  • 使用 strip() —— 清理用戶輸入數據
  • 選擇合適的檢驗方法 —— isdigit、isalpha 等
  • 用 translate —— 大規(guī)模字符替換時效率最高
  • 編碼統(tǒng)一 —— 優(yōu)先使用 UTF-8
  • 驗證輸入 —— 始終驗證外部輸入

九、總結

這 20 個字符串操作涵蓋了 Python 中 95% 的實際應用場景。關鍵是要理解:

  • 基礎操作(1-5):是所有字符串處理的基礎
  • 高效操作(6-7):join 和 split 是性能的關鍵
  • 驗證操作(11):確保數據質量
  • 正則表達式(13-16):處理復雜匹配的利器
  • 性能優(yōu)化(translate、compile):處理大規(guī)模數據的必備
責任編輯:趙寧寧 來源: Python數智工坊
相關推薦

2024-11-05 08:13:49

python視覺OpenCV

2024-07-03 10:31:21

2024-09-06 17:32:55

字符串Python

2023-08-07 16:18:12

Python字符串函數

2024-05-10 09:26:26

Python字符串

2019-10-22 22:31:15

Python切片字符串

2023-10-18 07:55:41

Python字符串

2024-06-05 10:35:24

Python字符串函數

2019-09-18 16:14:16

編碼方法重構

2021-05-18 09:08:18

字符串子串對象

2020-03-03 10:18:42

Python數據程序員

2020-03-03 14:55:03

Python代碼編程語言

2019-10-28 09:53:42

Java開發(fā)結構

2021-08-26 11:41:50

字符串String.jsVoca

2010-02-01 16:22:36

Python字符串操作

2023-11-27 16:01:59

JavaScrip技巧

2023-03-06 23:05:32

MySQL字符串函數

2019-03-05 11:22:17

操作系統(tǒng)調度算法

2019-04-02 15:20:18

JavaSpring注解

2020-02-23 23:29:07

Python編程開發(fā)
點贊
收藏

51CTO技術棧公眾號

亚洲欧美一区二区在线观看| 亚洲啊v在线观看| 欧美日韩国产在线看| 91久久极品少妇xxxxⅹ软件| 日韩av在线播| 女人av一区| 欧美精品电影在线播放| 男女激情免费视频| 青青久草在线| 久热成人在线视频| 欧美精品激情在线| 男人操女人动态图| 精品视频一区二区三区| 欧美日韩国产色| 91手机视频在线| 香港三日本三级少妇66| 免费人成网站在线观看欧美高清| 欧美成人免费va影院高清| 亚洲综合自拍网| 99视频这里有精品| 欧美小视频在线| 中文字幕色呦呦| 国产精品一区二区婷婷| 国产精品18久久久久久久久久久久 | 中文字幕avav| 色豆豆成人网| 亚洲成精国产精品女| 一本色道久久综合亚洲精品婷婷 | 五月天婷婷丁香| 999精品色在线播放| 国产视频精品在线| 日韩欧美国产片| 中文在线8资源库| 一区二区三区四区在线| 亚洲国产欧美日韩| 天堂av网在线| 国内久久婷婷综合| 国产精品激情av电影在线观看 | 国产丝袜精品丝袜| 国产精品久久久久久亚洲伦| 精品欧美一区二区精品久久| 国产精品久久久久久久久久久久久久久久久久| 99热在线精品观看| 欧美肥婆姓交大片| 国产男女猛烈无遮挡在线喷水| 粉嫩精品导航导航| 日韩一区二区在线观看| 手机版av在线| 成人久久网站| 一本一道久久a久久精品综合蜜臀| 久久av综合网| 欧美xxxbbb| 亚洲美女淫视频| www亚洲国产| 超碰在线国产| 国产欧美日韩视频一区二区| 欧美福利一区二区三区| 亚洲aⅴ乱码精品成人区| 菠萝蜜视频在线观看一区| av一区二区三区四区电影| 国产特黄一级片| 国产乱码精品一区二区三区av| 91精品国产综合久久男男 | 欧美变态口味重另类| 日韩欧美中文视频| 精品一区二区三区中文字幕在线 | 牛夜精品久久久久久久99黑人| 波霸ol色综合久久| 性欧美疯狂猛交69hd| 国产精品久久久久久久免费观看| www.久久久久久.com| 一级性生活免费视频| 欧美黄色精品| 97免费在线视频| 中文字幕在线欧美| 日本少妇一区二区| 国产日韩专区在线| 国产精品高潮呻吟AV无码| 国产综合久久久久久鬼色| 亚洲xxx大片| 开心激情综合网| proumb性欧美在线观看| 热re99久久精品国99热蜜月| 国产二区视频在线观看| 中文字幕日韩欧美一区二区三区| 中文字幕欧美日韩一区二区| 色呦呦在线免费观看| 亚洲国产日韩精品| 欧美性猛交久久久乱大交小说 | 亚洲不卡在线播放| 亚洲视频高清| 国产999在线| 国产人妻精品一区二区三区| 成人免费毛片嘿嘿连载视频| 欧美成人精品高清在线播放| 久久久无码人妻精品无码| 欧亚精品一区| 北条麻妃99精品青青久久| 国产一级久久久| 日本伊人精品一区二区三区观看方式| 成人激情视频网| 日韩在线观看视频一区二区三区| 国产欧美日韩不卡免费| 国产一区二区三区播放| 台湾佬成人网| 日韩精品一区二区三区蜜臀| 无码人妻精品一区二区中文| 欧美精品啪啪| 欧洲亚洲在线视频| 99草在线视频| 麻豆精品一区二区av白丝在线| 亚洲在线观看视频| 婷婷五月综合激情| 国产精品亲子乱子伦xxxx裸| 激情图片qvod| 婷婷激情一区| 日韩亚洲欧美一区二区三区| 中国黄色a级片| 中文字幕一区二区三区在线视频| 91av国产在线| 国产精品一区二区av白丝下载 | seseavlu视频在线| 亚洲综合男人的天堂| 成人观看免费完整观看| jizzyou欧美16| 亚洲精品电影网站| 欧美风情第一页| 免费视频一区| 99久久久精品免费观看国产| www.中文字幕久久久| 亚洲成人一二三| 中文字幕55页| 欧美精品久久久久久| 欧美高清一级大片| 国产男人搡女人免费视频| 国产盗摄精品一区二区三区在线| 日韩三级电影| gay欧美网站| 亚洲国产精品yw在线观看| 99久久99久久精品国产| 视频在线观看一区二区三区| 国产精品乱码一区二区三区| 在线视频自拍| 香蕉成人伊视频在线观看| 秋霞午夜鲁丝一区二区 | 在线播放 亚洲| 姬川优奈av一区二区在线电影| 亚洲成人久久久久| 久久免费在线观看视频| 经典三级在线一区| 亚洲国产日韩欧美| 日韩a**中文字幕| 欧美成人猛片aaaaaaa| 黄色a级片在线观看| 久久久亚洲一区| 日韩av高清在线播放| 男人的天堂免费在线视频| 欧美成人激情免费网| 婷婷伊人五月天| 狠狠色丁香久久婷婷综合_中| 日韩精品一区二区三区色偷偷| 成人亚洲欧美| 亚洲精品中文字幕女同| 国产成人愉拍精品久久| 白白色亚洲国产精品| 男人添女人荫蒂免费视频| crdy在线观看欧美| 欧美乱妇40p| www.日韩高清| 亚洲国产精品天堂| 亚洲黄色小说在线观看| 韩日欧美一区| 国产精品推荐精品| heyzo在线播放| 亚洲国产中文字幕在线观看| 国产精品黄色网| 91欧美一区二区| 不卡影院一区二区| 日韩欧美不卡| 91嫩草在线视频| 成人看av片| 日韩一区二区麻豆国产| 免费在线观看一级片| 成人国产一区二区三区精品| 国产黄色片免费在线观看| 开心激情综合| 国产成人亚洲精品| 最新电影电视剧在线观看免费观看 | 中文字幕一区二区三区四区五区人 | 亚洲综合色自拍一区| 在线观看国产三级| 在线观看视频日韩| 欧美日韩一区在线播放| 国产精品久久久久久久久久齐齐| 久久久精品久久| 日本免费不卡视频| 色8久久精品久久久久久蜜 | 色无极亚洲影院| 99国产超薄丝袜足j在线观看| 中日韩脚交footjobhd| 国产一区二区三区精品久久久| 91亚洲国产成人久久精品麻豆| 亚洲黄色在线视频| 五月开心播播网| 精品亚洲aⅴ乱码一区二区三区| av在线观看地址| 红桃成人av在线播放| 91在线免费网站| aa视频在线观看| 亚洲男女性事视频| 精品国产无码一区二区| 色综合视频在线观看| 精品国产视频在线观看| 久久新电视剧免费观看| 潘金莲激情呻吟欲求不满视频| 午夜影院日韩| 亚洲五码在线观看视频| 国产亚洲一区二区三区不卡| 96久久精品| 色豆豆成人网| 97热精品视频官网| 免费在线你懂的| 日韩av网址在线观看| 国产精品无码在线播放| 色88888久久久久久影院按摩 | 亚洲bbw性色大片| 国产乱人伦丫前精品视频| 国产精品久久一| 不卡一本毛片| 俺去了亚洲欧美日韩| 国产黄色免费在线观看| 精品国产污网站| 97人妻人人澡人人爽人人精品 | 男的插女的下面视频| 97精品中文字幕| 青青成人在线| 久久99国产精品视频| 国产精品theporn88| 亚洲三级在线| 国产成人精品视频在线| 国产丝袜视频在线播放| 国内精品在线一区| 最新日本在线观看| 最近2019中文免费高清视频观看www99 | 国产一级二级在线观看| 国产成人精品免费| 天天色天天综合网| 久久久久网站| 亚洲五月天综合| 国产精品第9页| 在线精品国产| 亚洲国产精品一区二区第四页av| 极品尤物一区| 久久66热这里只有精品| 亚洲一区二区三区中文字幕在线观看 | 欧美午夜精品免费| 日批视频免费在线观看| 精品日本高清在线播放| 你懂的国产视频| 精品国产成人在线| 日韩成人高清视频| 欧美日韩国产中文精品字幕自在自线| 国产精品第56页| 亚洲国产人成综合网站| 久久在线视频精品| 一区二区三区四区av| 日本一区二区免费在线观看| 亚洲线精品一区二区三区| 久久久久香蕉视频| 亚洲国产精品天堂| 免费在线一区二区三区| 亚洲va韩国va欧美va| 国产成人啪精品午夜在线观看| 亚洲国产视频一区| 青青草av在线播放| 亚洲免费观看在线视频| 天天做夜夜爱爱爱| 一区二区视频在线| 久久久久久久九九九九| 亚洲va天堂va国产va久| 欧美三级一区二区三区| 舔着乳尖日韩一区| 欧美高清69hd| 在线不卡的av| 成人午夜免费在线观看| 亚洲精品乱码久久久久久按摩观| 国产大片在线免费观看| 在线精品高清中文字幕| 免费高清完整在线观看| 九九精品在线视频| 中文字幕有码在线视频| 欧美一级大片视频| 91p九色成人| 91青青草免费在线看| 精品素人av| 日本午夜精品一区二区| 欧美极品一区二区三区| 亚洲色欲综合一区二区三区| 久久精品国产亚洲高清剧情介绍 | 91年精品国产| 亚洲最大成人综合网| 亚洲女性喷水在线观看一区| 亚洲 欧美 中文字幕| 欧美日韩国产美| 亚洲第一色网站| 亚洲日本中文字幕免费在线不卡| 在线免费看a| 国内免费精品永久在线视频| 日韩电影大全网站| 91入口在线观看| 麻豆一区二区麻豆免费观看| 午夜在线视频免费观看| 一区二区三区福利| 欧美一级xxxx| 久久综合九色综合欧美就去吻 | 欧美日韩少妇| 欧美牲交a欧美牲交aⅴ免费真| 精油按摩中文字幕久久| 亚洲久久久久久| 日韩一区中文字幕| 国产又黄又猛又粗又爽| 91精品国产色综合久久不卡蜜臀| 国产精品国产高清国产| 主播福利视频一区| 亚洲成人看片| 国产精品乱子乱xxxx| 国产精品麻豆久久| 蜜臀精品一区二区| 美女尤物国产一区| 中文字幕日韩三级片| 国产精品久久久久永久免费观看| 日韩欧美成人一区二区三区 | 色呦呦中文字幕| 欧美理论片在线观看| 成人国产激情| 老牛影视免费一区二区| 欧美久久综合| 91精产国品一二三| 亚洲人成网站色在线观看| 国产真人无遮挡作爱免费视频| 亚洲黄色av网站| 污的网站在线观看| 国产在线视频欧美| av伊人久久| 草草草在线视频| 久久精品视频免费观看| 日韩精品一区二区三| 91精品国产黑色紧身裤美女| av在线免费观看网站| 国产成人精品午夜| 欧美极品在线观看| 成年网站在线免费观看| 99久久免费国产| 激情综合网五月婷婷| 91麻豆精品国产自产在线| 国内精品久久久久久野外| 国产精品视频最多的网站| 色棕色天天综合网| 久久网站免费视频| 久久久精品tv| 黄色污污视频软件| 夜夜嗨av色综合久久久综合网| 免费v片在线观看| 久久久国产精品一区二区三区| 亚洲精品1234| 亚洲观看黄色网| 欧美性生活大片视频| 成人高清在线| 国产欧美亚洲视频| 国产精品一区二区三区av麻 | 国产一二三四区在线| 欧美丝袜丝nylons| 国产三区在线观看| 成人在线国产精品| 海角社区69精品视频| www.久久com| 黑人精品xxx一区一二区| 男女网站在线观看| 国产精品精品久久久久久| 一本一道久久综合狠狠老| 人妻激情偷乱视频一区二区三区| 一区二区国产盗摄色噜噜| 欧美特级特黄aaaaaa在线看| 91成人在线观看国产| 国产精品欧美三级在线观看| 九色porny自拍| 玉足女爽爽91| 91精品国产色综合久久不8| 久久久久久久久爱| 欧美女王vk| www.国产福利| 欧美日韩亚洲系列| 91官网在线| 成人欧美一区二区三区黑人免费| 男人的天堂亚洲| 任我爽在线视频| 亚洲精品一区二区三区在线观看| 国产中文在线播放| 黄色高清视频网站| 97精品国产露脸对白|