Python--控制台获取输入与正则表达式

这篇具有很好参考价值的文章主要介绍了Python--控制台获取输入与正则表达式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在Python编程中,控制台输入和正则表达式是两个重要而实用的概念。掌握这两个技巧可以帮助我们更灵活地处理用户输入以及对文本进行复杂的匹配和处理。本文中将详细介绍Python中如何通过控制台获取用户输入以及如何使用正则表达式进行文本处理。深入探讨输入类型转换、异常处理、多个输入值的存储等方面,并分享一些常见的正则表达式用法,如匹配数字、替换字符串、提取模式内容等。

一、控制台获取输入

1.1 字符串输入

# 输入字符串并赋值给变量str1:
str1 = input("请输入一个字符串: ")

1.2 整数输入

# 输入整数并赋值给变量count:
count = int(input("请输入一个整数: "))

1.3 浮点数输入

# 输入浮点数并赋值给变量float_num:
float_num = float(input("请输入一个浮点数: "))

1.4 布尔值输入

# 输入布尔值(True/False)并赋值给变量is_true:
is_true = bool(input("请输入一个布尔值(True/False): "))

请注意,bool()函数将任何非空字符串解释为True,空字符串解释为False。

1.5 列表输入

# 输入多个数字以空格分隔,并将它们作为列表存储在变量list1中:
list1 = input("请输入多个数字(以空格分隔): ").split()
list1 = [int(num) for num in list1]  # 将输入的数字转换为整数类型
print(list1)

这里使用了split()方法将输入的字符串切分成一个字符串列表,并使用列表推导式将字符串转换为整数类型。

# 输入多个字符串以逗号分隔,并将它们作为列表存储在变量str_list中:
str_list = input("请输入多个字符串(以逗号分隔): ").split(',')

这里使用了split()方法将输入的字符串切分成一个字符串列表,以逗号为分隔符。

1.6 汇总

# 在Python中,可以使用input()函数从控制台获取用户的输入。然后,根据需要进行类型转换和赋值。下面是一些示例:

# 输入字符串并赋值给变量str1:
str1 = input("请输入一个字符串: ")
# 输入整数并赋值给变量count:
count = int(input("请输入一个整数: "))
# 输入浮点数并赋值给变量float_num:
float_num = float(input("请输入一个浮点数: "))
# 输入布尔值(True/False)并赋值给变量is_true:
is_true = bool(input("请输入一个布尔值(True/False): "))
# 请注意,bool()函数将任何非空字符串解释为True,空字符串解释为False。

# 输入多个数字以空格分隔,并将它们作为列表存储在变量list1中:
list1 = input("请输入多个数字(以空格分隔): ").split()
list1 = [int(num) for num in list1]  # 将输入的数字转换为整数类型
print(list1)
# 这里使用了split()方法将输入的字符串切分成一个字符串列表,并使用列表推导式将字符串转换为整数类型。

# 输入多个字符串以逗号分隔,并将它们作为列表存储在变量str_list中:
str_list = input("请输入多个字符串(以逗号分隔): ").split(',')
# 这里使用了split()方法将输入的字符串切分成一个字符串列表,以逗号为分隔符。

# 记住,在处理用户输入时要小心异常情况,例如错误的类型转换或无效的输入。

二、正则表达式

2.1 匹配数字

# 导入re模块:
import re
# 匹配字符串中的数字:
pattern = r'\d+'  # 匹配连续的数字
text = "abc123def456ghi"
result = re.findall(pattern, text)
print(result)  # 输出: ['123', '456']

2.2 模式检查

# 检查字符串是否符合特定的模式:
pattern = r'^[A-Za-z0-9]+$'  # 检查是否只包含字母和数字
text = "abc123"
result = re.match(pattern, text)
if result:
    print("字符串符合要求")
else:
    print("字符串不符合要求")

2.3 替换字符

# 替换字符串中的部分内容:
pattern = r'\s+'  # 匹配连续的空格
text = "Hello   World"
new_text = re.sub(pattern, ' ', text) #表示把多个空格替换成一个空格
print(new_text)  # 输出: "Hello World"

2.4 切分字符串

# 切分字符串:
pattern = r'[,\s]+'  # 匹配逗号或空格
text = "apple,banana,orange"
result = re.split(pattern, text)
print(result)  # 输出: ['apple', 'banana', 'orange']

2.5 搜索并提取匹配的部分

# 搜索并提取匹配的部分:
pattern = r'\d{3}-\d{4}-\d{4}'  # 匹配电话号码的模式
text = "我的电话号码是:123-4567-8901"
result = re.search(pattern, text)
if result:
    print(result.group())  # 输出: '123-4567-8901'

注意: re.search() 与re.match()返回第一个匹配项,与 re.search() 不同的是,re.match() 方法只匹配字符串的开头部分。因此,如果需要输出所有匹配项,应该使用 re.findall() 方法。文章来源地址https://www.toymoban.com/news/detail-727855.html

2.6 使用捕获组提取匹配的部分

# 使用捕获组提取匹配的部分:
pattern = r'(\d{3})-(\d{4})-(\d{4})'  # 匹配电话号码的模式,并使用捕获组分别提取区号、中间号和尾号
text = "我的电话号码是:123-4567-8901"
result = re.search(pattern, text)
if result:
    area_code = result.group(1)
    middle_number = result.group(2)
    last_number = result.group(3)
    print(area_code, middle_number, last_number)  # 输出: '123', '4567', '8901'    

2.7 非贪婪匹配

# 非贪婪匹配(匹配最短的字符串):
pattern = r'<.*?>'  # 非贪婪匹配尖括号之间的内容
text = "<p>这是一个段落</p><p>另一个段落</p>"
result = re.findall(pattern, text)
print(result)  # 输出: ['<p>', '</p>', '<p>', '</p>']

2.8 忽略大小写匹配

# 忽略大小写匹配:
pattern = r'python'
text = "Python is a programming language"
result = re.findall(pattern, text, re.IGNORECASE)
print(result)  # 输出: ['Python']

2.9 使用预定义字符类

# 使用预定义字符类:
pattern = r'\w+'  # 匹配字母、数字和下划线
text = "Hello 123_world*&"
result = re.findall(pattern, text)
print(result)  # 输出: ['Hello', '123_world']

2.10 自定义字符类

# 自定义字符类:
pattern = r'[aeiou]'  # 匹配元音字母
text = "apple orange banana"
result = re.findall(pattern, text)
print(result)  # 输出: ['a', 'e', 'o', 'a', 'a']

2.11 零宽断言

# 零宽断言(Lookahead/Lookbehind):零宽断言允许你在匹配字符串时指定一些条件,但不会将这些条件包含在最终的匹配结果中。例如,可以使用正向零宽断言来匹配前面是特定模式的文本:
pattern = r'\w+(?=ing)'  # 匹配以 "ing" 结尾的单词的前面部分
text = "running jumping swimming"
result = re.findall(pattern, text)
print(result)  # 输出: ['runn', 'jump']

2.12 多行模式

# 多行模式:使用多行模式可以处理多行文本,其中 ^ 和 $ 元字符匹配每行的开头和结尾。通过传递 re.MULTILINE 标志给 re.compile() 函数或使用 re.M 缩写标志来启用多行模式:
pattern = r'^\d+$'  # 匹配只包含数字的行
text = "123\nabc\n456\n789"
result = re.findall(pattern, text, re.MULTILINE)
print(result)  # 输出: ['123', '456', '789']

2.13 嵌入式修饰符

# 嵌入式修饰符:可以在正则表达式中使用嵌入式修饰符来改变匹配的行为。例如,使用 (?i) 来忽略大小写匹配:
pattern = r'(?i)python'  # 忽略大小写匹配 "python"
text = "Python is a programming language"
result = re.findall(pattern, text)
print(result)  # 输出: ['Python']

2.14 替换时使用回调函数

# 替换时使用回调函数:使用 re.sub() 函数进行替换时,可以传递一个回调函数来处理每个匹配项,并返回替换后的结果。这允许你根据匹配到的内容动态生成替换值:
def replace_func(match):
    num = int(match.group(0))
    return str(num*2)

pattern = r'\d+'
text = "123423w 2w 3yui 4 5"
result = re.sub(pattern, replace_func, text)
print(result) #246846w 4w 6yui 8 10

2.15 非捕获组

# 非捕获组:有时你可能需要使用括号进行分组,但不需要捕获该组的内容。在这种情况下,可以使用非捕获组 (?:...):
pattern = r'(?:https?://)?(www\.[A-Za-z]+\.[A-Za-z]+)'
text = "Visit my website at www.example.com"
result = re.findall(pattern, text)
print(result)  # 输出: ['www.example.com']

2.16 前向引用(匹配重复子字符串)

# 前向引用:前向引用允许你引用之前已经匹配的内容。这在匹配重复的子字符串时非常有用:
pattern = r'(\w+)\s+\1'  # 匹配重复的单词
text = "apple apple banana banana cherry cherry"
result = re.findall(pattern, text)
print(result)  # 输出: ['apple', 'banana', 'cherry']

2.17 替换中使用命名分组引用

# 替换中使用命名分组引用:可以使用命名分组 (P<name>...) 来指定一个命名的捕获组,并在替换时使用 \\g<name> 引用该组的内容:
pattern = r'(?P<first>\d+)\s+(?P<second>\d+)'
text = "10 20"
result = re.sub(pattern, '\\g<second> \\g<first>', text)
print(result)  # 输出: "20 10"

2.18 回溯引用

# 回溯引用:使用回溯引用可以匹配重复的模式,并在替换时保留其中一个副本:
pattern = r'(\d+)-\1'  # 匹配连续重复的数字,例如 "22-22"
text = "11-11 22-22 33-33"
result = re.findall(pattern, text)
print(result)  # 输出: ['11', '22', '33']

2.19 负向前向引用

# 负向前向引用:负向前向引用允许你指定一个模式,该模式不能在当前位置之后出现。可以使用 (?!...) 来表示负向前向引用:
pattern = r'\b(?!un)\w+\b'  # 匹配不以 "un" 开头的单词
text = "happy unhappy apple banana"
result = re.findall(pattern, text)
print(result)  # 输出: ['happy', 'apple', 'banana']

2.20 嵌入条件匹配

# 嵌入条件匹配:使用 (?if:...) 来实现条件匹配。可以根据条件选择不同的模式进行匹配:
pattern = r'(?i)(?:(?<=Mr\.)|(?<=Ms\.)|(?<=Mrs\.))\s\w+'
text = "Hello Mr. Smith, Ms. Johnson, and Mrs. Davis"
result = re.findall(pattern, text)
print(result)  # 输出: ['Smith', 'Johnson', 'Davis']

2.21 后向引用断言

# 后向引用断言:使用 (?<=(...)) 来实现后向引用断言,即在匹配的位置之前必须满足某个条件:
pattern = r'\b(\w+)\b(?<=(ing))'  # 匹配以 "ing" 结尾的单词中的前面部分
text = "running jumping swimming"
result = re.findall(pattern, text)
print(result)  # 输出: ['runn', 'jump']

2.22 零宽负向断言

# 零宽负向断言:使用 (?<!...) 来实现零宽负向断言,即在当前位置之前不能满足某个条件:
pattern = r'(?<!un)\b\w+\b'  # 匹配不以 "un" 开头的单词
text = "happy unhappy apple banana"
result = re.findall(pattern, text)
print(result)  # 输出: ['happy', 'apple', 'banana']

2.23 转义序列匹配非打印字符

# 非打印字符:可以使用转义序列来匹配非打印字符,如制表符 \t、换行符 \n 等:
pattern = r'abc\tdef\nghi'
text = "abc\tdef\nghi"
result = re.findall(pattern, text)
print(result)  # 输出: ['abc\tdef\nghi']

2.24 贪婪与非贪婪匹配

# 贪婪与非贪婪匹配:在重复模式中,默认情况下是贪婪匹配,尽可能多地匹配。但可以使用 ? 来指定非贪婪匹配,尽可能少地匹配:
s = "aaaabaaaa"
pattern = r'a.*a'  # 贪婪匹配模式
match = re.search(pattern, s)
if match:
    print(match.group())  # 输出:'aaaabaaaa'

s = "aaaabaaaa"
pattern = r'a.*?a'  # 非贪婪匹配模式
match = re.search(pattern, s)
if match:
    print(match.group())  # 输出:'aaa'

2.25 汇总

# 在Python中,可以使用正则表达式模块re来进行字符串的匹配和处理。下面是一些常见的正则处理示例:
# 导入re模块:
import re
# 匹配字符串中的数字:
pattern = r'\d+'  # 匹配连续的数字
text = "abc123def456ghi"
result = re.findall(pattern, text)
print(result)  # 输出: ['123', '456']

# 检查字符串是否符合特定的模式:
pattern = r'^[A-Za-z0-9]+$'  # 检查是否只包含字母和数字
text = "abc123"
result = re.match(pattern, text)
if result:
    print("字符串符合要求")
else:
    print("字符串不符合要求")
    
# 替换字符串中的部分内容:
pattern = r'\s+'  # 匹配连续的空格
text = "Hello   World"
new_text = re.sub(pattern, ' ', text) #表示把多个空格替换成一个空格
print(new_text)  # 输出: "Hello World"

# 切分字符串:
pattern = r'[,\s]+'  # 匹配逗号或空格
text = "apple,banana,orange"
result = re.split(pattern, text)
print(result)  # 输出: ['apple', 'banana', 'orange']

# 搜索并提取匹配的部分:
pattern = r'\d{3}-\d{4}-\d{4}'  # 匹配电话号码的模式
text = "我的电话号码是:123-4567-8901"
result = re.search(pattern, text)
if result:
    print(result.group())  # 输出: '123-4567-8901'
    
# 使用捕获组提取匹配的部分:
pattern = r'(\d{3})-(\d{4})-(\d{4})'  # 匹配电话号码的模式,并使用捕获组分别提取区号、中间号和尾号
text = "我的电话号码是:123-4567-8901"
result = re.search(pattern, text)
if result:
    area_code = result.group(1)
    middle_number = result.group(2)
    last_number = result.group(3)
    print(area_code, middle_number, last_number)  # 输出: '123', '4567', '8901'    

# 非贪婪匹配(匹配最短的字符串):
pattern = r'<.*?>'  # 非贪婪匹配尖括号之间的内容
text = "<p>这是一个段落</p><p>另一个段落</p>"
result = re.findall(pattern, text)
print(result)  # 输出: ['<p>', '</p>', '<p>', '</p>']

# 忽略大小写匹配:
pattern = r'python'
text = "Python is a programming language"
result = re.findall(pattern, text, re.IGNORECASE)
print(result)  # 输出: ['Python']

# 使用预定义字符类:
pattern = r'\w+'  # 匹配字母、数字和下划线
text = "Hello 123_world*&"
result = re.findall(pattern, text)
print(result)  # 输出: ['Hello', '123_world']

# 自定义字符类:
pattern = r'[aeiou]'  # 匹配元音字母
text = "apple orange banana"
result = re.findall(pattern, text)
print(result)  # 输出: ['a', 'e', 'o', 'a', 'a']

# 零宽断言(Lookahead/Lookbehind):零宽断言允许你在匹配字符串时指定一些条件,但不会将这些条件包含在最终的匹配结果中。例如,可以使用正向零宽断言来匹配前面是特定模式的文本:
pattern = r'\w+(?=ing)'  # 匹配以 "ing" 结尾的单词的前面部分
text = "running jumping swimming"
result = re.findall(pattern, text)
print(result)  # 输出: ['runn', 'jump']

# 多行模式:使用多行模式可以处理多行文本,其中 ^ 和 $ 元字符匹配每行的开头和结尾。通过传递 re.MULTILINE 标志给 re.compile() 函数或使用 re.M 缩写标志来启用多行模式:
pattern = r'^\d+$'  # 匹配只包含数字的行
text = "123\nabc\n456\n789"
result = re.findall(pattern, text, re.MULTILINE)
print(result)  # 输出: ['123', '456', '789']

# 嵌入式修饰符:可以在正则表达式中使用嵌入式修饰符来改变匹配的行为。例如,使用 (?i) 来忽略大小写匹配:
pattern = r'(?i)python'  # 忽略大小写匹配 "python"
text = "Python is a programming language"
result = re.findall(pattern, text)
print(result)  # 输出: ['Python']

# 替换时使用回调函数:使用 re.sub() 函数进行替换时,可以传递一个回调函数来处理每个匹配项,并返回替换后的结果。这允许你根据匹配到的内容动态生成替换值:
def replace_func(match):
    num = int(match.group(0))
    return str(num*2)

pattern = r'\d+'
text = "123423w 2w 3yui 4 5"
result = re.sub(pattern, replace_func, text)
print(result) #246846w 4w 6yui 8 10

# 非捕获组:有时你可能需要使用括号进行分组,但不需要捕获该组的内容。在这种情况下,可以使用非捕获组 (?:...):
pattern = r'(?:https?://)?(www\.[A-Za-z]+\.[A-Za-z]+)'
text = "Visit my website at www.example.com"
result = re.findall(pattern, text)
print(result)  # 输出: ['www.example.com']

# 前向引用:前向引用允许你引用之前已经匹配的内容。这在匹配重复的子字符串时非常有用:
pattern = r'(\w+)\s+\1'  # 匹配重复的单词
text = "apple apple banana banana cherry cherry"
result = re.findall(pattern, text)
print(result)  # 输出: ['apple', 'banana', 'cherry']

# 替换中使用命名分组引用:可以使用命名分组 (P<name>...) 来指定一个命名的捕获组,并在替换时使用 \\g<name> 引用该组的内容:
pattern = r'(?P<first>\d+)\s+(?P<second>\d+)'
text = "10 20"
result = re.sub(pattern, '\\g<second> \\g<first>', text)
print(result)  # 输出: "20 10"

# 回溯引用:使用回溯引用可以匹配重复的模式,并在替换时保留其中一个副本:
pattern = r'(\d+)-\1'  # 匹配连续重复的数字,例如 "22-22"
text = "11-11 22-22 33-33"
result = re.findall(pattern, text)
print(result)  # 输出: ['11', '22', '33']

# 负向前向引用:负向前向引用允许你指定一个模式,该模式不能在当前位置之后出现。可以使用 (?!...) 来表示负向前向引用:
pattern = r'\b(?!un)\w+\b'  # 匹配不以 "un" 开头的单词
text = "happy unhappy apple banana"
result = re.findall(pattern, text)
print(result)  # 输出: ['happy', 'apple', 'banana']

# 嵌入条件匹配:使用 (?if:...) 来实现条件匹配。可以根据条件选择不同的模式进行匹配:
pattern = r'(?i)(?:(?<=Mr\.)|(?<=Ms\.)|(?<=Mrs\.))\s\w+'
text = "Hello Mr. Smith, Ms. Johnson, and Mrs. Davis"
result = re.findall(pattern, text)
print(result)  # 输出: ['Smith', 'Johnson', 'Davis']

# 后向引用断言:使用 (?<=(...)) 来实现后向引用断言,即在匹配的位置之前必须满足某个条件:
pattern = r'\b(\w+)\b(?<=(ing))'  # 匹配以 "ing" 结尾的单词中的前面部分
text = "running jumping swimming"
result = re.findall(pattern, text)
print(result)  # 输出: ['runn', 'jump']

# 零宽负向断言:使用 (?<!...) 来实现零宽负向断言,即在当前位置之前不能满足某个条件:
pattern = r'(?<!un)\b\w+\b'  # 匹配不以 "un" 开头的单词
text = "happy unhappy apple banana"
result = re.findall(pattern, text)
print(result)  # 输出: ['happy', 'apple', 'banana']

# 非打印字符:可以使用转义序列来匹配非打印字符,如制表符 \t、换行符 \n 等:
pattern = r'abc\tdef\nghi'
text = "abc\tdef\nghi"
result = re.findall(pattern, text)
print(result)  # 输出: ['abc\tdef\nghi']

# 贪婪与非贪婪匹配:在重复模式中,默认情况下是贪婪匹配,尽可能多地匹配。但可以使用 ? 来指定非贪婪匹配,尽可能少地匹配:
s = "aaaabaaaa"
pattern = r'a.*a'  # 贪婪匹配模式
match = re.search(pattern, s)
if match:
    print(match.group())  # 输出:'aaaabaaaa'

s = "aaaabaaaa"
pattern = r'a.*?a'  # 非贪婪匹配模式
match = re.search(pattern, s)
if match:
    print(match.group())  # 输出:'aaa'

到了这里,关于Python--控制台获取输入与正则表达式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java程序设计入门教程--控制台输入数据

    控制台输入数据常用类 Scanner类        在 很多情况下,我们需要 Java 程序能够对我们指定的值进行计算,这样的话就需要我们的 Java 程序能够读取我们所输入的值。我们可以使用 Java 自带的 Scanner 类来从控制台获取 输入 。        Scanner 类在包 java.util 里。我们一般在程

    2024年02月07日
    浏览(32)
  • IDEA中单元测试使用Scanner控制台无法输入

    今天使用IDEA,Junit使用Scanner控制台无法输入,我以为是代码的问题。于是把单元测试换成了main函数,发现控制台可以输入。那么如何解决这个问题呢? 目录 idea控制台不能输入 解决 IDEA控制台中不能输入数据 idea控制台不能输入 下面是一个简单的测试代码: 在该单元测试运

    2024年04月26日
    浏览(28)
  • shell脚本while循环、read读取控制台输入与函数

    声明: 以下为个人笔记,内容不完全正确,请谨慎参考。 while循环结构 while [条件判断] do 程序 done 脚本示例: 点击查看代码 简易写法: 点击查看代码 read 读取控制台输入 基本语法: read(选项)(参数) 1、选项 -p: 指定读取值时的字符; -t: 指定读取值等待时间(秒-s)如

    2024年04月22日
    浏览(41)
  • 关于使用Selenium获取网页控制台的数据

    需要获取网页的控制台的数据,如下图 Pycharm安装 Selenium安装 Selenium中的find_element方法 //供参考 这里使用Chrome有一个技巧可以直接复制元素的信息 到此我们已经完成了一部分简单的自动化操作了 接下来我们需要记录和获取控制台的信息,这部分参考可参考 jmeter-调用python脚本

    2024年02月02日
    浏览(41)
  • 【IDEA】解决mac版IDEA,进行单元测试时控制台不能输入问题

    //增加如下配置,重启IDEA

    2024年02月04日
    浏览(38)
  • PyCharm控制台输入import torch报错:ModuleNotFoundError: No module named ‘torch‘解决方法

    PyCharm控制台输入import torch报错:ModuleNotFoundError: No module named \\\'torch’解决方法 原因是没有打开pytorch环境 进入Anaconda Prompt界面,输入conda activate pytorch,然后回Pycharm控制台输入import torch就不会报错啦

    2024年02月09日
    浏览(42)
  • PyCharm 调试过程中控制台 (Console) 窗口内运行命令 - 实时获取中间状态

    ​​​ [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

    2024年02月20日
    浏览(55)
  • 如何使用Python的交互控制台

    简介 Python的交互控制台(也叫做Python解释器,或是Python Shell)为程序员提供了\\\"运行指令\\\"和\\\"不创建文件测试测试代码\\\"的快速途径。 交互控制台可以调用所有的Python内置函数和任何已安装的模块、命令行历史、和自动补全。它为\\\"探索Python语言\\\"和\\\"写好代码后粘贴入文件\\\"提供了

    2024年02月02日
    浏览(56)
  • python控制台学生管理系统

    设计初始界面 设计学生信息录入 【数据校准】录入判断 学生姓名不能为空,并且不成超过4个字 【数据校准】录入判断年龄在0-120 需要进行判断 【数据校准】录入需要判断学号是否为空与学号是否在10位数 【数据校准】录入需要判断成绩是否在0-100之间、并判断录入成绩为

    2024年02月09日
    浏览(33)
  • Python 清空控制台的几种方法

    我们在写代码的时候经常会发现:当Python控制台输入过多的Python语句时,有时需要将这些已经输入的语句和执行结果清空,并重新开始输入Python语句。我们不再想要展现控制台上显示的内容,需要将他们 清空 ,我们该怎样做呢? 我们在Python Console中输入reset 但是这种方法也

    2024年02月09日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包