0%

站点配置文件 .config.yml

1、site 部分

*修改站点配置文件里面的 *

1
2
3
4
5
6
title: 标题
subtitle: 副标题
description: 描述
author: 作者
language: 语言(简体中文是zh-CN)
timezone: 网站时区(Hexo 默认使用您电脑的时区,不用写)

修改生成的链接

默认连接太长,而且不是同一个链接。丢失原来的访问次数

方便分享和管理,推荐设置如下:

1
permalink: :year/:month/:day/:second/

文章按创建时间排序

1
2
3
4
5
6
7
8
# Home page setting
# path: Root path for your blogs index page. (default = '')
# per_page: Posts displayed per page. (0 = disable pagination)
# order_by: Posts order. (Order by date descending by default)
index_generator:
path: ""
per_page: 10 # 每页数量
order_by: -date

修改网站图标

修改主题配置文件的 favicon 部分

修改文章模板

自定义 hexo new file 时生成的 .md文件的模板

修改站点文件夹下的 scaffolds/post.mdscaffolds/draft.md 如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
---
title: {{ title }}
date: {{ date }}
updated: {{ date }}
permalink:
top: 0
password:
comments:
copyright: true
tags:
categories:
keywords:
description:
---

推送设置

1
2
3
4
deploy:
type: git
repo: https://github.com/yxhsiao/yxhsiao.github.io
branch: master

主题配置文件 .config.yml

选择主题样式:

Scheme 是 NexT 提供的一种特性,借助于 Scheme,NexT 为你提供多种不同的外观。同时,几乎所有的配置都可以 在 Scheme 之间共用。目前 NexT 支持三种 Scheme

1
2
3
4
5
6
7
8
9
10
#Muse - 默认 Scheme,这是 NexT 最初的版本,黑白主调,大量留白
#Mist - Muse 的紧凑版本,整洁有序的单栏外观
#Pisces - 双栏 Scheme,小家碧玉似的清新

Scheme Settings
# Schemes
# scheme: Muse
# scheme: Mist
# scheme: Pisces
scheme: Gemini

修改菜单栏

1
2
3
4
5
6
7
8
9
menu:
home: / || fa fa-home //首页
archives: /archives/ || fa fa-archive //归档
categories: /categories/ || fa fa-th //分类
tags: /tags/ || a fa-tags //标签
about: /about/ || fa fa-user //关于
#schedule: /schedule/ || fa fa-calendar //日程表
#sitemap: /sitemap.xml || fa fa-sitemap //站点地图
#commonweal: /404/ || fa fa-heartbeat //公益404

设置侧边栏

1
2
3
4
5
6
7
8
9
10
11
12
13
sidebar:
# Sidebar Position - 侧栏位置(只对Pisces | Gemini两种风格有效)
position: left //靠左放置
#position: right //靠右放置

# Sidebar Display - 侧栏显示时机(只对Muse | Mist两种风格有效)
#display: post //默认行为,在文章页面(拥有目录列表)时显示
display: always //在所有页面中都显示
#display: hide //在所有页面中都隐藏(可以手动展开)
#display: remove //完全移除
offset: 12 //文章间距(只对Pisces | Gemini两种风格有效)
b2t: false //返回顶部按钮(只对Pisces | Gemini两种风格有效)
scrollpercent: true //返回顶部按钮的百分比

添加搜索功能

要安装插件

1
npm install hexo-generator-searchdb --save

然后修改站点配置文件中的 search:

1
2
3
4
5
search:
path: search.xml
field: post
format: html
limit: 10000

修改主题配置文件:

1
2
3
4
# Local Search
# Dependencies: https://github.com/next-theme/hexo-generator-searchdb
local_search:
enable: true

隐藏页脚的 “由 xxxx 强力驱动”

修改主题配置文件 footer 部分的 powered 的值为你想要的

1
2
footer:
powered: false # false: 不显示 true: 显示

博客主题跟随系统主题

修改主题配置文件的 darkmode 部分

1
2
# Dark Mode
darkmode: auto # dark|light|auto

加载条阅读进度提示

修改主题配置文件 reading_progress 部分

1
2
3
4
5
6
reading_progress:
enable: true # 是否启用
# Available values: top | bottom
position: bottom # top: 顶部 bottom: 底部
color: "#37c6c0" #颜色
height: 3px #高度

侧栏回到顶部按钮

修改主题配置文件 back2top 部分

1
2
back2top:
enable: true # 是否启用

侧栏阅读进度提示

修改主题配置文件 back2top 部分

1
2
3
4
back2top:
# Scroll percent label in b2t button.
scrollpercent: true # 是否显示阅读进度

边栏显示图像和社交信息

修改主题配置文件的 avatar 和 social 部分

1
2
3
4
5
6
7
# Sidebar Avatar
avatar:
url: /images/site/avatar.jpeg # 图片地址
rounded: true # 是否可旋转
rotated: true # 是否圆角
# Posts / Categories / Tags in sidebar.
site_state: true
1
2
3
4
5
6
7
8
9
social:
GitHub: https://github.com/iitii || fab fa-github
E-Mail: mailto:ccmejx@gmail.com || fa fa-envelope
Telegram: https://t.me/callmehelp || fab fa-telegram

social_icons:
enable: true # 是否启用
icons_only: false # 只显示图标
transition: false

添加书签(记录阅读位置)

  • 修改主题配置文件 bookmark 部分
1
2
3
4
bookmark:
enable: true # 是否启用
color: "#222" # 颜色
save: auto # auto: 自动保存 manual: 手动保存

页脚设置站点建立时间

比如文章底部的: © 2018 – 2021

修改主题配置文件 footer 部分的 since 的值为你想要的

1
2
3
footer:
# Specify the year when the site was setup. If not defined, current year will be used.
since: 2021

修改页脚时间和作者之间的图标

修改主题配置文件 footer 部分的 icon 的值为你想要的

1
2
3
4
5
6
7
footer:
icon:
name: fa fa-heart # 图标 See: https://fontawesome.com/icons
animated: true # 是否有动画效果
color: "#ff0000" #图标颜色

copyright: # 不填写将以站点配置文件里面的作者填充

版权信息

搜索creative_commons:

1
2
3
4
5
creative_commons:
license: by-nc-sa
sidebar: false #首页边栏是否显示
post: true #文章底部是否显示
language:

站点访问人数和总访问量

修改next主题配置文件,搜索busuanzi_count:

1
2
3
4
5
6
7
8
busuanzi_count:
enable: true
total_visitors: true
total_visitors_icon: user
total_views: true
total_views_icon: eye
post_views: true
post_views_icon: eye

修改文章底部的标签带标签图标

修改主题配置文件 tag_icon 部分

1
tag_icon: true # true: 显示为图标

自定义文件的路径

修改主题配置文件 custom_file_path 部分

路径为根目录,而非主题目录

1
2
3
4
5
6
7
8
9
10
11
custom_file_path:
head: source/_data/head.njk #添加自定义内容在 head
#header: source/_data/header.njk #添加自定义内容在顶栏
#sidebar: source/_data/sidebar.njk #添加自定义内容在边栏
#postMeta: source/_data/post-meta.njk #添加自定义文章的 meta 信息
postBodyEnd: source/_data/post-body-end.njk #添加自定义内容在文章尾部
#footer: source/_data/footer.njk #添加自定义内容在页脚
#bodyEnd: source/_data/body-end.njk
#variable: source/_data/variables.styl
#mixin: source/_data/mixins.styl
style: source/_data/styles.styl #添加自定义css

页脚添加运行时间

添加如下内容到 source/_data/footer.njk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<br /> #换行
<!-- 网站运行时间的设置 -->
<span id="timeDate">载入天数...</span>
<span id="times">载入时分秒...</span>
<script>
var now = new Date();
function createtime() {
var grt= new Date("04/21/2019 15:54:40");//此处修改你的建站时间或者网站上线时间
now.setTime(now.getTime()+250);
days = (now - grt ) / 1000 / 60 / 60 / 24; dnum = Math.floor(days);
hours = (now - grt ) / 1000 / 60 / 60 - (24 * dnum); hnum = Math.floor(hours);
if(String(hnum).length ==1 ){hnum = "0" + hnum;} minutes = (now - grt ) / 1000 /60 - (24 * 60 * dnum) - (60 * hnum);
mnum = Math.floor(minutes); if(String(mnum).length ==1 ){mnum = "0" + mnum;}
seconds = (now - grt ) / 1000 - (24 * 60 * 60 * dnum) - (60 * 60 * hnum) - (60 * mnum);
snum = Math.round(seconds); if(String(snum).length ==1 ){snum = "0" + snum;}
document.getElementById("timeDate").innerHTML = "本站已安全运行 "+dnum+" 天 ";
document.getElementById("times").innerHTML = hnum + " 小时 " + mnum + " 分 " + snum + " 秒";
}
setInterval("createtime()",250);
</script>

页脚添加总访问量

修改next主题配置文件,搜索busuanzi_count:

1
2
3
4
5
6
7
8
busuanzi_count:
enable: true
total_visitors: true
total_visitors_icon: user
total_views: true
total_views_icon: eye
post_views: true
post_views_icon: eye

文章尾部添加本文结束标记

在博客根目录/source/_data下新建post-body-end.njk文件写入以下内容:

1
2
3
<div>
<div class="end-slogan" style="text-align:center;font-size:22px;letter-spacing:10px;user-seclect:none;color:#bbb">----------- 本文结束<i class="fa fa-star"></i>感谢阅读-----------</div>
</div>

然后在主题配置文件中取消注释:

1
2
- #postBodyEnd: source/_data/post-body-end.njk
+ postBodyEnd: source/_data/post-body-end.njk

正则表达式

正则表达式(称为RE,或正则,或正则表达式模式)本质上是嵌入在Python中的一种微小的、高度专业化的编程语言,可通过 re 模块获得。 使用这种小语言,你可以为要匹配的可能字符串集指定规则;此集可能包含英语句子,电子邮件地址,TeX命令或你喜欢的任何内容。 然后,您可以询问诸如“此字符串是否与模式匹配?”或“此字符串中的模式是否匹配?”等问题。 你还可以使用正则修改字符串或以各种方式将其拆分。
正则表达式模式被编译成一系列字节码,然后由用 C 编写的匹配引擎执行。对于高级用途,可能需要特别注意引擎如何执行给定的正则,并将正则写入以某种方式生成运行速度更快的字节码。 本文档未涉及优化,因为它要求你充分了解匹配引擎的内部结构。
正则表达式语言相对较小且受限制,因此并非所有可能的字符串处理任务都可以使用正则表达式完成。 还有一些任务 可以 用正则表达式完成,但表达式变得非常复杂。 在这些情况下,你最好编写 Python 代码来进行处理;虽然 Python 代码比精心设计的正则表达式慢,但它也可能更容易理解。

正则表达式的语法

正则表达式(或 RE)指定了一组与之匹配的字符串;模块内的函数可以检查某个字符串是否与给定的正则表达式匹配
python中的正则表达式有内置的模块re. 只要导入就能使用。(import re)

re模块的方法

有了准备知识,我们就可以在Python中使用正则表达式了。Python提供re模块,包含所有正则表达式的功能。由于Python的字符串本身也用\转义,所以要特别注意。 因此强烈建议使用Python的r前缀(raw模式),就不用考虑转义的问题了

方法 / 属性 目的
match() 确定正则是否从字符串的开头匹配。
search() 扫描字符串,查找此正则匹配的任何位置。
findall() 找到正则匹配的所有子字符串,并将它们作为列表返回。
finditer() 找到正则匹配的所有子字符串,并将它们返回为一个 iterator。
sub() 用于替换字符串中的匹配项
split() 将字符串拆分成列表

match()方法

  • 判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。
  • 从头开始匹配
1
2
import re
re.match(r'^\d{3}-\d{3,8}$', '010-12345')
1
<re.Match object; span=(0, 9), match='010-12345'>

查看匹配结果

方法 / 属性 目的
group() 返回正则匹配的字符串
start() 返回匹配的开始位置
end() 返回匹配的结束位置
span() 返回包含匹配 (start, end) 位置的元组
  • group() 返回正则匹配的子字符串。
  • start() 和 end() 返回匹配的起始和结束索引。
  • span() 在单个元组中返回开始和结束索引。
  • 由于 match() 方法只检查正则是否在字符串的开头匹配,所以 start() 将始终为零。

如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来。
注意到group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。

但是,模式的 search() 方法会扫描字符串,因此在这种情况下匹配可能不会从零开始。:

exp
1
2
3
4
5
6
result=re.match(r'\d{3}-\d{3,8}', '010-12345678')
result

result.group()
result.start(),result.end()
result.span()
1
2
3
4
<re.Match object; span=(0, 12), match='010-12345678'>
'010-12345678'
(0, 12)
(0, 12)
exp
1
2
3
4
5
6
result=re.match(r'(\d{3})-\d{3,8}', '010-1234567890')
result

result.group(),result.group(0),result.group(1)
result.start(),result.end()
# result.span()
1
2
3
<re.Match object; span=(0, 12), match='010-12345678'>
('010-12345678', '010-12345678', '010')
(0, 12)

serch()方法

  • 在要查找的字符串中从左到右开始查找,找到1个后就返回匹配对象,否则None
exp
1
2
3
4
5
6
result=re.search (r'(\d{3})-(\d{3,8})', '087010-123456789013579-1234678902468')
result

result.group(),result.group(0),result.group(1),result.group(2)
result.start(),result.end()
result.span()
1
2
3
4
<re.Match object; span=(3, 15), match='010-12345678'>
('010-12345678', '010-12345678', '010', '12345678')
(3, 15)
(3, 15)

findall()方法

  • 在查找范围内找出所有符合条件的匹配对象
  • 返回一个列表
exp
1
2
result=re.findall (r'(\d{3})-(\d{3,8})', '087010-123456789013579-1234678902468')
result
1
[('010', '12345678'), ('579', '12346789')]

finditer() 方法

  • 将一个 匹配对象 的序列返回为一个 iterator
exp
1
2
3
4
5
result = re.finditer(r'(\d{3})-(\d{3,8})',
'087010-123456789013579-1234678902468')
result

[x for x in result]
1
<callable_iterator at 0x67c3238>
exp
[<re.Match object; span=(3, 15), match='010-12345678'>,
 <re.Match object; span=(19, 31), match='579-12346789'>]
1
2
3
4
5
6
7

result = re.finditer(r'(\d{3})-(\d{3,8})',
'087010-123456789013579-1234678902468')
result


[x.groups() for x in result]
1
2
<callable_iterator at 0x66ae9b8>
[('010', '12345678'), ('579', '12346789')]

sub()方法

  • 用于替换字符串中的匹配项
exp
1
2
3
4
# 将‘-’ 替换成空格‘***’
result = re.sub(r'-','***',
'087010-123456789013579-1234678902468')
result
1
'087010***123456789013579***1234678902468'
exp
1
2
3
4
# 将大于4的数字 替换成空格‘***’
result = re.sub(r'[5-9]','*',
'087010-123456789013579-1234678902468')
result
1
'0**010-1234*****013***-1234****024**'

split方法

  • 能够按照所能匹配的字串将字符串进行切分,返回切分后的字符串列表
  • re.split(pattern, string, maxsplit=0, flags=0)
  • pattern:匹配的字符串
  • string:需要切分的字符串
  • maxsplit:分隔次数,默认为0(即不限次数)
  • flags:标志位,用于控制正则表达式的匹配方式,比如:是否区分大小写
exp
1
2
3
4
str1 = 'ab cde f  gHi'
re.split(r'\s',str1)

re.split(r'\s+',str1)
1
2
['ab', 'cde', 'f', '', 'gHi']
['ab', 'cde', 'f', 'gHi']
exp
1
2
str1 = 'ab cde f  gHi'
re.split(r'\s+',str1,2)
1
['ab', 'cde', 'f  gHi']

元字符

. ^ $ * + ? { } [ ] \ | ( )

符号 意义
. 半角句号,匹配任意单个字符,除了换行符。
[ ] 字符种类。匹配方括号内的任意字符
[^] 否定的字符种类。匹配除了方括号内的任意字符
* 匹配 >= 0 个重复的 在 * 号之前的字符
+ 匹配 >= 1 个重复的 在 + 号之前的字符
? 匹配 0 ~1 个重复的 在 ? 号之前的字符
{n} 匹配 = n 个 {} 号之前的字符或字符集
{n,} 匹配 >=n 个 {} 号之前的字符或字符集
{n,m} 匹配 >=n ~ <=m 个 {} 号之前的字符或字符集
(abc) 字符集。匹配与 abc 相等的字符串
| 运算符。匹配符号前或后的字符
^ 从首位开始匹配
$ 从末尾开始匹配
\ 转义字符。用于匹配一些保留的字符 如:[] () { } . * + ? ^ $ \ |

组合

(...)

(组合),匹配括号内的任意正则表达式,并标识出组合的开始和结尾。匹配完成后,组合的内容可以被获取,并可以在之后用 \number 转义序列进行再次匹配,之后进行详细说明。要匹配字符 ‘(‘ 或者 ‘)’, 用 ( 或 ), 或者把它们包含在字符集合里: [(], [)].

(?…)

这是个扩展标记法 (一个 ‘?’ 跟随 ‘(‘ 并无含义)。 ‘?’ 后面的第一个字符决定了这个构建采用什么样的语法。这种扩展通常并不创建新的组合; (?P <name>…) 是唯一的例外。 以下是目前支持的扩展。

(?aiLmsux)

( ‘a’, ‘i’, ‘L’, ‘m’, ‘s’, ‘u’, ‘x’ 中的一个或多个) 这个组合匹配一个空字符串;这些字符对正则表达式设置以下标记 re.A (只匹配ASCII字符), re.I (忽略大小写), re.L (语言依赖), re.M (多行模式), re.S (点dot匹配全部字符), re.U (Unicode匹配), and re.X (冗长模式)。 (这些标记在 模块内容 中描述) 如果你想将这些标记包含在正则表达式中,这个方法就很有用,免去了在 re.compile() 中传递 flag 参数。标记应该在表达式字符串首位表示。

(?:…)

正则括号的非捕获版本。 匹配在括号内的任何正则表达式,但该分组所匹配的子字符串 不能 在执行匹配后被获取或是之后在模式中被引用。

(?aiLmsux-imsx:…)

(‘a’, ‘i’, ‘L’, ‘m’, ‘s’, ‘u’, ‘x’ 中的0或者多个, 之后可选跟随 ‘-‘ 在后面跟随 ‘i’ , ‘m’ , ‘s’ , ‘x’ 中的一到多个 .) 这些字符为表达式的其中一部分 设置 或者 去除 相应标记 re.A (只匹配ASCII), re.I (忽略大小写), re.L (语言依赖), re.M (多行), re.S (点匹配所有字符), re.U (Unicode匹配), and re.X (冗长模式)。(标记描述在 模块内容 .)

‘a’, ‘L’ and ‘u’ 作为内联标记是相互排斥的, 所以它们不能结合在一起,或者跟随 ‘-‘ 。 当他们中的某个出现在内联组中,它就覆盖了括号组内的匹配模式。在Unicode样式中, (?a:…) 切换为 只匹配ASCII, (?u:…) 切换为Unicode匹配 (默认). 在byte样式中 (?L:…) 切换为语言依赖模式, (?a:…) 切换为 只匹配ASCII (默认)。这种方式只覆盖组合内匹配,括号外的匹配模式不受影响。

(?P<name>…)

(命名组合)类似正则组合,但是匹配到的子串组在外部是通过定义的 name 来获取的。组合名必须是有效的Python标识符,并且每个组合名只能用一个正则表达式定义,只能定义一次。一个符号组合同样是一个数字组合,就像这个组合没有被命名一样。

命名组合可以在三种上下文中引用。如果样式是 (?P <quote>[‘“]).*?(?P=quote) (也就是说,匹配单引号或者双引号括起来的字符串):

引用组合 “quote” 的上下文 引用方法
在正则式自身内 (?P=quote) (如示)\1
处理匹配对象m m.group('quote')``m.end('quote') (等)
传递到 re.sub() 里的 repl 参数中 \g<quote>``\g<1>``\1

(?P=name)

反向引用一个命名组合;它匹配前面那个叫 name 的命名组中匹配到的串同样的字串。

(?#…)

(?#…)
注释;里面的内容会被忽略。

(?=…)
匹配 … 的内容,但是并不消费样式的内容。这个叫做 lookahead assertion。比如, Isaac (?=Asimov) 匹配 ‘Isaac ‘ 只有在后面是 ‘Asimov’ 的时候。

(?!…)
匹配 … 不符合的情况。这个叫 negative lookahead assertion (前视取反)。比如说, Isaac (?!Asimov) 只有后面 不 是 ‘Asimov’ 的时候才匹配 ‘Isaac ‘ 。

(?<=…)

匹配字符串的当前位置,它的前面匹配 … 的内容到当前位置。这叫 positive lookbehind assertion (正向后视断定)。 (?<=abc)def 会在 ‘abcdef’ 中找到一个匹配,因为后视会往后看3个字符并检查是否包含匹配的样式。包含的匹配样式必须是定长的,意思就是 abc 或 a|b 是允许的,但是 a* 和 a{3,4} 不可以。注意以 positive lookbehind assertions 开始的样式,如 (?<=abc)def ,并不是从 a 开始搜索,而是从 d 往回看的。你可能更加愿意使用 search() 函数,而不是 match() 函数:

(?<!…)

匹配当前位置之前不是 … 的样式。这个叫 negative lookbehind assertion (后视断定取非)。类似正向后视断定,包含的样式匹配必须是定长的。由 negative lookbehind assertion 开始的样式可以从字符串搜索开始的位置进行匹配.

(?(id/name)yes-pattern|no-pattern)

如果给定的 id 或 name 存在,将会尝试匹配 yes-pattern ,否则就尝试匹配 no-pattern,no-pattern 可选,也可以被忽略。
比如,()?(\w+@\w+(?:.\w+)+)(?(1)?(%5Cw+@%5Cw+(?:%5C.%5Cw+)+)(?(1))|$)
是一个email样式匹配,将匹配 ‘user@host.com‘ 或 ‘user@host.com‘ ,但不会匹配 ‘<user@host.com‘ ,也不会匹配 ‘user@host.com>’。

\ 和字母的特殊序列

\number

匹配数字代表的组合。每个括号是一个组合,组合从1开始编号。比如 (.+) \1 匹配 ‘the the’ 或者 ‘55 55’, 但不会匹配 ‘thethe’ (注意组合后面的空格)。这个特殊序列只能用于匹配前面99个组合。如果 number 的第一个数位是0, 或者 number 是三个八进制数,它将不会被看作是一个组合,而是八进制的数字值。在 ‘[‘ 和 ‘]’ 字符集合内,任何数字转义都被看作是字符。

\A

只匹配字符串开始。

\b\B

\b匹配空字符串,但只在单词开始或结尾的位置。一个单词被定义为一个单词字符的序列。注意,通常 \b 定义为 \w 和 \W 字符之间,或者 \w 和字符串开始/结尾的边界, 意思就是 r’\bfoo\b’ 匹配 ‘foo’, ‘foo.’, ‘(foo)’, ‘bar foo baz’ 但不匹配 ‘foobar’ 或者 ‘foo3’。

\B 匹配空字符串,但不能在词的开头或者结尾。意思就是 r’py\B’ 匹配 ‘python’, ‘py3’, ‘py2’, 但不匹配 ‘py’, ‘py.’, 或者 ‘py!’. \B 是 \b 的取非,所以Unicode样式的词语是由Unicode字母,数字或下划线构成的,虽然可以用 ASCII 标志来改变。如果使用了 LOCALE 标志,则词的边界由当前语言区域设置。

\d\D

\d 对于 Unicode (str) 样式:
匹配任何Unicode十进制数(就是在Unicode字符目录[Nd]里的字符)。这包括了 [0-9] ,和很多其他的数字字符。如果设置了 ASCII 标志,就只匹配 [0-9] 。对于8位(bytes)样式:匹配任何十进制数,就是 [0-9]。

\D 匹配任何非十进制数字的字符。就是 \d 取非。 如果设置了 ASCII 标志,就相当于 [^0-9] 。

\s\S

\s 对于 Unicode (str) 样式:匹配任何Unicode空白字符(包括 [ \t\n\r\f\v] ,还有很多其他字符,比如不同语言排版规则约定的不换行空格)。如果 ASCII 被设置,就只匹配 [ \t\n\r\f\v] 。对于8位(bytes)样式:匹配ASCII中的空白字符,就是 [ \t\n\r\f\v] 。

\S 匹配任何非空白字符。就是 \s 取非。如果设置了 ASCII 标志,就相当于 [^ \t\n\r\f\v] 。

\w\W

\w对于 Unicode (str) 样式:匹配Unicode词语的字符,包含了可以构成词语的绝大部分字符,也包括数字和下划线。如果设置了 ASCII 标志,就只匹配 [a-zA-Z0-9_] 。对于8位(bytes)样式:匹配ASCII字符中的数字和字母和下划线,就是 [a-zA-Z0-9_] 。如果设置了 LOCALE 标记,就匹配当前语言区域的数字和字母和下划线。

\W 匹配非单词字符的字符。这与 \w正相反。如果使用了 ASCII 旗标,这就等价于 [^a-zA-Z0-9_]。如果使用了 LOCALE 旗标,则会匹配当前区域中既非字母数字也非下划线的字符。

\Z

只匹配字符串尾。

常用表达式

校验字符

匹配内容 表达式
汉字 ^[\u4e00-\u9fa5]{0,}$
英文和数字 ^[A-Za-z0-9]+$ ``或 ^[A-Za-z0-9]{4,40}$
长度为3-20的所有字符 ^.{3,20}$
由26个英文字母组成的字符串 ^[A-Za-z]+$
由26个大写英文字母组成的字符串 ^[A-Z]+$
由26个小写英文字母组成的字符串 ^[a-z]+$
由数字和26个英文字母组成的字符串 ^[A-Za-z0-9]+$
由数字、26个英文字母或者下划线组成的字符串 ^\w+$ 或 ^\w{3,20}$
中文、英文、数字包括下划线 ^[\u4E00-\u9FA5A-Za-z0-9_]+$
中文、英文、数字但不包括下划线等符号 ^[\u4E00-\u9FA5A-Za-z0-9]+$ ``或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
可以输入含有^%&’,;=?$"等字符 [^%&',;=?$\x22]+ 12
禁止输入含有~的字符 [^~\x22]+
全角符号 [\uFF00-\uFFFF]
半角符号 [\u0000-\u00FF]

校验数字

匹配内容 表达式
数字 ^[0-9]*$
n位的数字 ^\d{n}$
至少n位的数字 ^\d{n,}$
m-n位的数字 ^\d{m,n}$
零和非零开头的数字 ^(0|[1-9][0-9]*)$
非零开头的最多带两位小数的数字 ^([1-9][0-9]*)+(.[0-9]{1,2})?$
带1-2位小数的正数或负数 ^(\-)?\d+(\.\d{1,2})?$
正数、负数、和小数 ^(\-|\+)?\d+(\.\d+)?$
有两位小数的正实数 ^[0-9]+(.[0-9]{2})?$
有1~3位小数的正实数 ^[0-9]+(.[0-9]{1,3})?$
非零的正整数 ^[1-9]\d*$^([1-9][0-9]*){1,3}$^\+?[1-9][0-9]*$
非零的负整数 ^\-[1-9][]0-9"*$^-[1-9]\d*$
非负整数 ^\d+$^[1-9]\d*|0$
非正整数 ^-[1-9]\d*|0$<或 ^((-\d+)|(0+))$
非负浮点数 ^\d+(\.\d+)?$^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
非正浮点数 ^((-\d+(\.\d+)?)|(0+(\.0+)?))$^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
正浮点数 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
负浮点数 ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
浮点数 ^(-?\d+)(\.\d+)?$^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

特殊匹配

匹配内容 表达式
Email地址 ^\w+([-+]\w+)*@\w+([-]\w+)*\\w+([-]\w+)*$
域名 [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/?
InternetURL [a-zA-z]+://[^\s]*^http://([\w-]+\)+[\w-]+(/[\w-/?%&=]*)?$
手机号码 `^(13[0-9]
电话号码 ^(\(\d{3,4}-)|\d{34}-)?\d{7,8}$
国内电话号码(0511-4405222、021-87888822) `\d{3}-\d{8}
身份证号(15位、18位数字) ^\d{15}|\d{18}$
短身份证号码(数字、字母x结尾) `^([0-9]){7,18}(x
帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线) ^[a-zA-Z][a-zA-Z0-9_]{4,15}$
密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线) ^[a-zA-Z]\w{5,17}$
强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间) ^(?=*\d)(?=*[a-z])(?=*[A-Z]){8,10}$
日期格式 ^\d{4}-\d{1,2}-\d{1,2}
一年的12个月(01~09和1~12) `r’^(0?[1-9]
一个月的31天(01~09和1~31) `r’^((0?[1-9])
xml文件 `r’^([a-zA-Z]+-?)+[a-zA-Z0-9]+[x
1到3个数字,后面跟个逗号+3个数字,逗号成为可选,而不是必须 `r’^([0-9]+
中文字符的正则表达式 r'[\u4e00-\u9fa5]'
双字节字符 [^\x00-\xff](可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
空白行的正则表达式 r '\n\s*\r'(可以用来删除空白行)
首尾空白字符的正则表达式 ^\s*|\s*$(^\s*)|(\s*$)(可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
腾讯QQ号(腾讯QQ号从10000开始) [1-9][0-9]{4,}
中国邮政编码 [1-9]\d{5}(?!\d)
提取网页图片 \\<*[img][^\\\\>]*[src]*=*[\\"\\']{0,1}([^\\"\\'\\>]*)
提取网页颜色代码 r’^#([A-Fa-f0-9]{6}
文件扩展名效验 `r’^([a-zA-Z]:|\)\([^\]+\)[^/:?”<>

Datetime模块

导入模块

  • 只导入模块名
  • 使用模块的类时需要写的代码较长如:使用date类的today()方法就要写:datetime.date.today()
1
2
3
4
5
6
import datetime

datetime.date.today()
datetime.date.today().isocalendar()
datetime.datetime.now()
datetime.datetime.now().isoformat()
exp:
datetime.date(2021, 8, 4)
1
datetime.IsoCalendarDate(year=2021, week=31, weekday=3)
exp:
datetime.datetime(2021, 8, 4, 1, 21, 54, 884090


'2021-08-04T01:21:54.885103'

导入模块的类

1
2
3
- 这样可以省略模块名
- `from datetime import date` # 导入datetime的date类
- `from datetime import date, time, datetime,timedelta` # 一次导入datetime的多个常用类
exp:
1
2
3
4
5
6
from datetime import date, time, datetime, timedelta

date.today()
date.today().isocalendar()
datetime.now()
datetime.now().isoformat()
exp:
1
2
3
datetime.date(2021, 8, 4)
datetime.IsoCalendarDate(year=2021, week=31, weekday=3)
datetime.datetime(2021, 8, 4, 1, 21, 54, 904688)
'2021-08-04T01:21:54.904688'

模块中包含的类

类名功能说明
date日期对象,常用的属性有year, month, day
time时间对象
datetime日期时间对象,常用的属性有hour, minute, second, microsecond
datetime_CAPI日期时间对象C语言接口
timedelta时间间隔,即两个时间点之间的长度
tzinfo时区信息对象

date类

date对象构成

1
2
3
4
- date对象由year年份、month月份及day日期三部分构成:
- `datetime.date(self, /, *args, **kwargs)`
- 返回日期对象元组(year,month,day)
- 通过`.year`,`. month`,`.day` 分别获取年月日

常用类的方法和属性

date.max 对象所能表示的最大日期(9999-12-31
date.min 对象所能表示的最小日期(0001-01-01)
date.today()返回一个表示当前本地时间的date对象
date.resolutiondate对象表示日期的最小单位(天)
date.fromtimestamp(timestamp)根据给定的时间戳,返回一个date对象

常用的方法和属性

d.year
d.month
d.day
d.replace(year[,month[,day]])生成并返回一个新的日期对象,原日期对象不变
d.timetuple()返回日期对应的时间元组(time.struct_time)对象
d.toordinal()返回日期是自0001-01-01开始的第多少天
d.weekday()返回日期是星期几,[0,6],0表示星期一,1表示星期二
d.isoweekday()返回日期是星期几,[1,7],1表示星期一,2表示星期二
d.isocalendar()返回格式为(year,weekday,isoweekday)的元组
d.isoformat()返回‘YYYY-MM-DD’格式的日期字符串
d.strftime()自定义格式化字符串(和time模块的strftime()方法相同)
### 返回当前日期

exp:

1
2
3
4
5
# 返回当前日期

d = date.today()

d, d.year, d.month, d.day
(datetime.date(2021, 8, 4), 2021, 8, 4)

最大最小日期

exp:

1
2
3
# date类能表示的最大/最小的年、月、日的数值

date.max, date.min
(datetime.date(9999, 12, 31), datetime.date(1, 1, 1))

最小日期单位

exp

1
2
3
# date对象表示日期的最小单位。这里是天

date.resolution
datetime.timedelta(days=1)

从时间戳返回date

1
2
3
4
5
6
# 根据给定的时间戮,返回一个date对象
# datetime.date.fromtimestamp()传入的是时间戳,需要用time模块

# import time

# date.fromtimestamp(time.time()).month

返回年、月、日

exp

1
2
3
# .year,.month,.day属性

date.today().year
2021

替换年、月、日

exp:

1
2
3
4
5
6
7
# .replace属性

# 替换年份
date.today().replace(year=2019)

# 替换日期
date.today().replace(day=23)
1
2
datetime.date(2019, 8, 4)
datetime.date(2021, 8, 23)

返回time.struct_time类型

exp

1
2
# 该方法为了兼容time.localtime(...)返回一个类型为time.struct_time的数组,但有关时间的部分元素值为0:
date.today().timetuple()
1
time.struct_time(tm_year=2021, tm_mon=8, tm_mday=4, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=216, tm_isdst=-1)

返回元年至今的天数

exp

1
2
3
# 返回公元公历开始到现在的天数。公元1年1月1日为1

date.today().toordinal()
1
738006

返回周一为0的星期

exp:

1
2
3
# 返回指定日期所在的星期数(周一为0…周日为6)

date.today().weekday()
1
2

返回周一为1的星期

exp:

1
2
3
# 返回符合ISO标准的指定日期所在的星期数(周一为1…周日为7)

date.today().isoweekday()
1
3

返回标准日历

exp:

1
2
3
# 返回一个包含三个值的元组,三个值依次为:year年份,week number周数,weekday星期数(周一为1…周日为7):

date.today().isocalendar()
1
datetime.IsoCalendarDate(year=2021, week=31, weekday=3)

返回 (YYYY-MM-DD) 的日期字符串

exp:

1
2
3
#返回符合ISO 8601标准 (YYYY-MM-DD) 的日期字符串

date.today().isoformat()
1
'2021-08-04'

返回指定的字符串日期格式

exp:

1
date.today().strftime('%Y-%m-%d-%a-%A-%W')
1
'2021-08-04-Wed-Wednesday-31'

time类

  • time类和time模块各自独立

  • datetime.time(hour[,minute[,decond[,microsecond[,tzinfo]]]])

常用类的方法和属性

time.max表示的最大时间
time.min表示的最小时间
time.resolution时间的最小单位,这里是1微秒

常用的方法和属性

t.hour时
t.minute
t.second
t.microsecond微秒
t.tzinfo时区信息
t.replace()用参数指定替代(时,分,秒,微秒,时区)对象,生成并返回新的对象
t.isoformat()返回'HH:MM:SS'格式字符串
t.strftime()返回自定义格式化字符串

最大最小时间

exp:

1
time.max,time.min
1
(datetime.time(23, 59, 59, 999999), datetime.time(0, 0))

最小时间单位

exp:

1
time.resolution
1
datetime.timedelta(microseconds=1)

返回指定的字符串时间格式

exp:

1
time(23, 57, 34, 345).strftime("%H:%M:%S")
1
'23:57:34'

返回标准的字符串格式

exp:

1
time(23, 57, 34, 345).isoformat()
1
'23:57:34.000345'

datetime类

  • 相当于date和time结合起来

  • datetime.datetime(year,month,day[,hour[,minute[,second[,microsecond[,tzinfo]]]]])

常用类的方法和属性

datetime.max最大日期
datetime.min最小日期
datetime.resolutiondatetime对象所表示日期的最小单位,1微秒
datetime.today()返回当前本地时间
datetime.now([tz])返回当前本地时间,如果指定tz,则返回tz时区当地时间
datetime.fromtimestamp(timestamp[,tz])根据给定的时间戳返回datetime对象,如果指定tz,则返回tz时区datetime对象
datetime.utcfromtimestamp(timestamp)根据时间戳创建一个datetime对象

常用的方法和属性

dt.year
dt.month
dt.day
dt.hour
dt.minute
dt.second 秒 
dt.microsecond微妙
dt.tzinfo时区信息
dt.date()获取dt的date对象
dt.time()获取dt的time对象,tzinfo为none
dt.timetz()获取dt的time对象,tzinfo为与datetime的tzinfo相同
dt.replace()指定参数替代(年,月,日,时,分,秒,微妙,时区),生成并返回新对象
dt.utctimetuple()返回UTC时间对应的时间元组(不包括tzinfo)
dt.timestamp()返回dt对象对应的时间戳
dt.toordinal()返回日期是是自0001-01-01开始的第多少天(与date类相同)
dt.weekday()返回日期是星期几,[1,7],1表示星期一(与date类相同)
dt.isocalendar()返回格式如(year,month,day)的时间元组(与date类相同)
dt.ctime()等价与time模块的time.ctime(time.mktime(d.timetuple()))
dt.strftime()返回指定格式的时间字符串

返回当前时刻

exp:

1
datetime.now()
1
datetime.datetime(2021, 8, 4, 1, 21, 55, 184731)

返回日期date

exp:

1
datetime.now().date()
1
datetime.date(2021, 8, 4)

返回时间time

exp:

1
datetime.now().time()
1
datetime.time(1, 21, 55, 216736)

返回UTC时间元组

exp:

1
datetime.now().utctimetuple()
1
time.struct_time(tm_year=2021, tm_mon=8, tm_mday=4, tm_hour=1, tm_min=21, tm_sec=55, tm_wday=2, tm_yday=216, tm_isdst=0)

将date对象和time对象合并

exp:

1
2
3
4
5
a=datetime.now()
d=a.date()
t=a.time()

datetime.combine(d,t)
1
datetime.datetime(2021, 8, 4, 1, 21, 55, 248728)

返回当前时刻的UTC

exp:

1
2
datetime.utcnow()
datetime.now()
1
2
datetime.datetime(2021, 8, 3, 17, 21, 55, 264729)
datetime.datetime(2021, 8, 4, 1, 21, 55, 264729)

根据字符串返回datetime

exp:

1
datetime.strptime("2021-07-31 23:45","%Y-%m-%d %H:%M")
1
datetime.datetime(2021, 7, 31, 23, 45)

timedelta类

  • 时间加减(代表了两个datetime之间的时间差)

  • datetime.timedalta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0 ,hours=0,weeks=0)

  • 在日期上做天,小时,分钟,秒,毫秒,微秒,周 的时间计算

    • 1毫秒转换为1000微秒

    • 1分钟转换为60秒

    • 1小时转换为3600秒

    • 1周转换为7天

  • 其中,timedelta内部只存储 days,seconds,microseconds

常用类的方法和属性

td.days天(范围[-999999999,999999999])
td.seconds秒(范围[0,86399])
td.microseconds微秒(范围[0,999999])
td.total_seconds()以秒为单位返回该时间差
### 时间的加减

exp:

1
2
3
4
5
6
7
8
9
10
11
12
start_time = datetime.now()


# 指定天数:days=? 默认天,可以省略
# 指定小时:hours=?
# 指定分钟:minutes=?
# 指定秒钟:seconds=?
# 指定微秒:microseconds=?
# 指定星期:weeks=?

end1=start_time + timedelta(1)
end1
1
datetime.datetime(2021, 8, 5, 1, 21, 55, 296744)

exp:

1
start_time + timedelta(hours=16)
1
datetime.datetime(2021, 8, 4, 17, 21, 55, 296744)

exp:

1
start_time + timedelta(hours=16,minutes=35)
1
datetime.datetime(2021, 8, 4, 17, 56, 55, 296744)

exp:

1
start_time + timedelta(hours=16,seconds=40,weeks=2,days=1)
1
datetime.datetime(2021, 8, 19, 17, 22, 35, 296744)

计算上个月的最后一天和第一天的日期

exp:

1
2
3
4
5
6
7
8
9
# 计算上个月的最后一天和第一天的日期

td = date.today() # 获取当前日期
a = datetime(td.year, td.month, 1) # 获取本月的第一天
x = a + timedelta(days=-1)
x

y = datetime(x.year, x.month, 1)
y
1
2
datetime.datetime(2021, 7, 31, 0, 0)
datetime.datetime(2021, 7, 1, 0, 0)

计算上周一和周日的日期

exp:

1
2
3
4
w = date.today().isoweekday()
d1=date.today()-timedelta(w+6)
d7=date.today()-timedelta(w)
d1,d7
1
(datetime.date(2021, 7, 26), datetime.date(2021, 8, 1))

计算指定日期当月最后一天的日期和本月天数

exp:

1
2
3
4
a = "1978-9-2"
d = datetime.strptime(a, "%Y-%m-%d")
d1 = datetime(d.year, d.month + 1, 1) - timedelta(1)
d1.strftime("%Y-%m-%d"), d1.day
1
('1978-09-30', 30)

计算指定日期下个月当天的日期

exp:

1
2
3
4
a = "2002-1-9"
d = datetime.strptime(a, "%Y-%m-%d")
d1 = datetime(d.year, d.month + 1, d.day)
d1.strftime("%Y-%m-%d")
1
'2002-02-09'

获得本周一至今天的时间段并获得上周对应同一时间段

exp:

1
2
3
4
td=date.today().isoweekday()
d1=date.today()-timedelta(td-1)
[d1.isoformat(),date.today().isoformat(),]
[(d1-timedelta(weeks=1)).isoformat(),(date.today()-timedelta(weeks=1)).isoformat()]
1
2
['2021-08-02', '2021-08-04']
['2021-07-26', '2021-07-28']

日期的字符串输出

python中的日期时间格式化

符号说明
%y两位数的年份表示(00-99)
%Y四位数的年份表示(000-9999)
%m月份(01-12)
%d月内中的一天(0-31)
%H24小时制小时数(0-23)
%I12小时制小时数(01-12)
%M分钟数(00=59)
%S秒(00-59)
%a本地简化星期名称
%A本地完整星期名称
%b本地简化的月份名称
%B本地完整的月份名称
%c本地相应的日期表示和时间表示
%j年内的一天(001-366)
%p本地A.M.或P.M.的等价符
%U一年中的星期数(00-53)星期天为星期的开始
%w星期(0-6),星期天为星期的开始
%W一年中的星期数(00-53)星期一为星期的开始
%x本地相应的日期表示
%X本地相应的时间表示
%Z当前时区的名称
%%%号本身

字符串

认识字符串

  • 字符串是一个序列。一种不可变序列,它包含的字符存在从左到右的位置顺序。
  • 不可变是指:字符串创建以后无法修改它的内容。
  • 字符串由一对双引号或者单引号包围
1
2
'hell , python'
"你好!北京"
1
2
'hell , python'
'你好!北京'

转义字符

‘ \‘ ‘ 字符串中的引号处理

  • 如果字符串中含有引号要用转义字符处理
1
'who\'re you'
1
"who're you"

‘ \\ ‘ 转义反斜杠

1
print("判断对错!是\\否")
1
判断对错!是\否

‘ \n ‘ 换行符

1
2
3
# \n在输出时换行,
str1 = "Where are you from ? \nbeijing"
print(str)
1
<class 'str'>

‘ \t ‘ 退格符

1
2
3
print('Where are you from ?\tbeijing')

print('Where are you from ?\t\tbeijing')
1
2
Where are you from ?	beijing
Where are you from ? beijing

“ \ “ 长字符串换行

  • 长代码换行,可以把一个长字符串写成多行
  • 实际输出还是一行
1
2
3
4
str1 = 'Where are you from ?\
beijing'

print(str1)
1
Where are you from ?beijing

字符串原样输出

“”” “”” / ‘’’ ‘’’ 三引号或三单引号包围

1
2
3
4
print('''你学会了吗?Y or N?
有什么明白的? ---- 请及时提出来!
OK!
''')
1
2
3
你学会了吗?Y or N?
有什么明白的? ---- 请及时提出来!
OK!

r’ ‘模式输出

  • 关闭转义机制
  • raw 字符串块
1
r'你学会了吗?Y or N? \n 有什么明白的?\t\t 请及时提出来!OK! '
1
'你学会了吗?Y or N? \\n 有什么明白的?\\t\\t 请及时提出来!OK! '
1
r'D:\GTJA\RichEZ\newVer\files\f11\tdxf11_zs.htm'
1
'D:\\GTJA\\RichEZ\\newVer\\files\\f11\\tdxf11_zs.htm'
1
f'D:\GTJA\RichEZ\newVer\files\f11\tdxf11_zs.htm'
1
'D:\\GTJA\\RichEZ\newVer\x0ciles\x0c11\tdxf11_zs.htm'

字符串的操作

  • 字符串是一个序列,可以像序列一样操作

索引和切片

1
2
3
4
str1 = 'python_ string'

# len()函数获取字符串的长度,任意符号以及空格占位符都是一个元素
len(str1)
1
14
1
2
3
4
5
6
7
8
str1 = 'python  _ string'

# 可以索引,可以切片

print(str1[3])
print(str1[2:9])
print(str1[::2])
print(str1[::-1])
1
2
3
4
h
thon _
pto _srn
gnirts _ nohtyp

统计

1
2
3
4
str1.count('n')

str1.count('t', 3)
str1.count('t', 3, -5)
1
2
3
2
1
0

字符串的拼接

以连续书写的形式拼接字符串

1
2
s1 = 'htmml' 'css' 'c++' 'Java'
s1
1
'htmmlcssc++Java'

+运算符拼接字符串

1
2
3
s1 = 'html'
s2 = 'python'
s1 + s2
1
'htmlpython'

字符串的分割

  • str.split(sep,maxsplit)

  • str:表示要进行分割的字符串;

  • sep:用于指定分隔符,可以包含多个字符。此参数默认为 None,表示所有空字符,包括空格、换行符“\n”、制表符“\t”等。

  • maxsplit:可选参数,用于指定分割的次数,最后列表中子串的个数最多为 maxsplit+1。如果不指定或者指定为 -1,则表示分割次数没有限制。

  • 在 split 方法中,如果不指定 sep 参数,那么也不能指定 maxsplit 参数。

默认分隔符为空格

1
2
3
str1 = 'python  _ string'

str1.split()
1
['python', '_', 'string']
1
2
3
str1 = 'python_string'

str1.split()
1
['python_string']

指定分隔符

1
2
3
4
str1 = 'python  _ python.string'

str1.split('_')
str1.split('.')
1
2
['python  ', ' python.string']
['python _ python', 'string']

同时指定分隔符和最大分割数量

1
2
str1 = r'my\name\is\hell\kety'
str1.split('\\', 3)
1
['my', 'name', 'is', 'hell\\kety']

字符串的合并

  • str.join(iterable)
  • 相当于split的反向操作
1
2
s1 = ['my', 'name', 'is', 'hell', 'kety']
str.join('/', s1)
1
'my/name/is/hell/kety'

查找指定字符串

.find()方法

  • .find(sub[, start[, end]]) -> int
  • 找什么?
  • 从哪个位置开始,哪个位置结束
  • 返回找到的数量
1
2
3
str1 = 'python  _ string'

str1.find('t')
1
2

index() 方法

  • 返回查找值首次出现的位置索引。
  • 可以用于检索是否包含指定的字符串,不同之处在于,当指定的字符串不存在时,index() 方法会抛出异常。
1
2
str1 = 'python  _ string'
str1.index('h')
1
3

字符串对齐

ljust() 方法

  • S.ljust(width[, fillchar])
  • S:表示要进行填充的字符串;
  • width:表示包括 S 本身长度在内,字符串要占的总长度;
  • fillchar:作为可选参数,用来指定填充字符串时所用的字符,默认情况使用空格。
1
2
3
4
s1 = 'guangzhou'
s2 = 'bj'
s1.ljust(20, '*')
s2.ljust(20, '-')
1
2
'guangzhou***********'
'bj------------------'

rjust() 方法

  • S.rjust(width[, fillchar])
  • 参数含义同ljust()
  • rjust() 方法是向字符串的左侧填充指定字符
1
2
3
4
s1 = 'guangzhou'
s2 = 'bj'
s1.rjust(20, '*')
s2.rjust(20, '-')
1
2
'***********guangzhou'
'------------------bj'

center() 方法

  • S.center(width[, fillchar])
  • 参数同
  • 让文本居中,而不是左对齐或右对齐
1
2
3
4
s1 = 'guangzhou'
s2 = 'bj'
s1.center(20, '*')
s2.center(20, '-')
1
2
'*****guangzhou******'
'---------bj---------'

检索字符串开头结尾

startswith()方法

  • str.startswith(sub[,start[,end]])
  • 检索是否以指定字符串开头
  • str:表示原字符串;
  • sub:要检索的子串;
  • start:指定检索开始的起始位置索引,如果不指定,则默认从头开始检索;
  • end:指定检索的结束位置索引,如果不指定,则默认一直检索在结束。
1
2
s1 = 'guangzhou'
s1.startswith('s')
1
False

endswith()方法

  • str.endswith(sub[,start[,end]])
  • 检索是否以指定字符串结尾
  • 参数同
1
2
s1 = 'guangzhou'
s1.endswith('ou')
1
True

大小写转换

title()方法

1
2
s1 = 'guangzhOu shenzhEn'
s1.title()
1
'Guangzhou Shenzhen'

lower()方法

1
2
s1 = 'guangzhOu shenzhEn'
s1.lower()
1
'guangzhou shenzhen'

upper()方法

1
2
s1 = 'guangzhOu shenzhEn'
s1.upper()
1
'GUANGZHOU SHENZHEN'

删除特殊字符

strip()方法

  • str.strip([chars])
  • str 表示原字符串
  • [chars] 用来指定要删除的字符,可以同时指定多个,如果不手动指定,则默认会删除空格以及制表符、回车符、换行符等特殊字符。
  • 删除字符串前后(左右两侧)的空格或特殊字符
1
2
3
s1 = r'  guang  zhou '

s1.strip()
1
'guang  zhou'

lstrip()方法

  • 删除字符串左侧的空格和特殊字符
1
2
s1 = r'  guang  zhou '
s1.lstrip()
1
'guang  zhou '

rstrip()方法

  • 删除字符串右侧的空格和特殊字符
1
2
s1 = r'  guang  zhou '
s1.rstrip()
1
'  guang  zhou'

warning: LF will be replaced by CRLF

Git 可以在你提交时自动地把回车(CR)和换行(LF)转换成换行(LF),而在检出代码时把换行(LF)转换成回车(CR)和换行(LF)。 你可以用git config --global core.autocrlf true 来打开此项功能。 如果是在 Windows 系统上,把它设置成 true,这样在检出代码时,换行会被转换成回车和换行:

1
2
#提交时转换为LF,检出时转换为CRLF
$ git config --global core.autocrlf true

error:spawn failed…

  1. 删除.deploy_git文件夹;

  2. 输入git config --global core.autocrlf false

  3. 然后,依次执行:
    hexo clean
    hexo g
    hexo d

  4. 或者:修改_config.yml配置文件:

    deploy:

    type: git

    repo: https://github.com/yourname/yourname.github.io.git

    branch: master

    其中的repo修改为

    git@github.com:yourname/yourname.github.io.git

Validating config

1
2
3
4
5
6
npm un hexo-deployer-git 
npm i hexojs/hexo-deployer-git

hexo clean
hexo g
hexo d

fatal: unable to access “https://…”: OpenSSL SSL_read: Connection was reset, errno 10054

1、可能用户名及邮箱错误,重新配置

查看用户名及邮箱

1
2
git config user.name
git config user.email

修改用户名、邮箱

1
2
git config --global user.name "xxx"
git config --global user.email "xxx"

移除仓库,重新添加

1
2
git remote rm origin
git remote add origin https://github.com/XXX

2、修改解除SSL认证。

在Git Bash中输入以下命令:

1
git config --global http.sslVerify "false"

3、文件体积太大

改为500MB,在Git Bash中输入以下命令:

1
git config http.postBuffer 5242880003

4、更新DNS缓存

在cmd中输入以下命令:

1
ipconfig /flushdns

padding属性

padding值是元素的内容和边界之间的空间。与margin的区别在于一个是指定自己与外部其他元素之间的边距,一个是指定内部元素与边界之间的边距。 两者的属性值相同,只是对象不同。padding属性是以下内容的简写属性:

阅读全文 »

Rz与Ra对比  Rz100时相当于Ra25    

Rz 100 50 25 12.5 6.3
Ra 25 12.5 6.3 3.2 1.6
Rz 3.2 1.6 0.8 0.4 0.2
Ra 0.8 0.4 0.2 0.1 0.05

日本表面粗糙度的老标准。  
对应关系:
▽:Ra25~12.5
▽▽:Ra6.3~3.2
▽▽▽:Ra1.6~0.4
▽▽▽▽:Ra0.2~0.0013

·

昔时贤文,诲汝谆谆。 集韵增广,多见多闻。 观今宜鉴古,无古不成今。

知己知彼,将心比心。 酒逢知己饮,诗向会人吟。相识满天下,知心能几人?

相逢好似初相识,到老终无怨恨心。近水知鱼性,近山识鸟音。

易涨易退山溪水,易反易覆小人心。运去金成铁,时来铁似金。

读书须用意,一字值千金。逢人且说三分话,未可全抛一片心。

有意栽花花不发,无心插柳柳成荫。画虎画皮难画骨,知人知面不知心。

钱财如粪土,仁义值千金。流水下滩非有意,白云出岫本无心。

当时若不登高望,谁信东流海洋深?路遥知马力,日久见人心。

两人一般心,无钱堪买金;一人一般心,有钱难买针。

相见易得好,久住难为人。马行无力皆因瘦,人不风流只为贫。

饶人不是痴汉,痴汉不会饶人。是亲不是亲,非亲却是亲。

美不美,乡中水;亲不亲,故乡人。莺花犹怕春光老,岂可教人枉度春?

相逢不饮空归去,洞口桃花也笑人。红粉佳人休使老,风流浪子莫教贫。

在家不会迎宾客,出门方知少主人。黄芩无假,阿魏无真。

客来主不顾,自是无良宾。良宾方不顾,应恐是痴人。

贫居闹市无人问,富在深山有远亲。谁人背后无人说,哪个人前不说人?

有钱道真语,无钱语不真。不信但看筵中酒,杯杯先劝有钱人。

闹里挣钱,静处安身。来如风雨,去似微尘。

长江后浪推前浪,世上新人赶旧人。近水楼台先得月,向阳花木早逢春。

古人不见今时月,今月曾经照古人。先到为君,后到为臣。

莫道君行早,更有早行人。莫信直中直,须防仁不仁。

山中有直树,世上无直人。自恨枝无叶,莫怨太阳偏。

一切都是命,半点不由人。一年之计在于春,一日之计在于寅。

一家之计在于和,一生之计在于勤。责人之心责己,恕己之心恕人。

守口如瓶,防意如城。宁可人负我,切莫我负人。

再三须慎意,第一莫欺心。虎身犹可近,人毒不堪亲。

来说是非者,便是是非人。远水难救近火,远亲不如近邻。

有酒有肉多兄弟,急难何曾见一人?人情似纸张张薄,世事如棋局局新。

山中也有千年树,世上难逢百岁人。力微休负重,言轻莫劝人。

无钱休入众,遭难莫寻亲。平生不做皱眉事,世上应无切齿人。

士者国之宝,儒为席上珍。若要断酒法,醒眼看醉人。

求人须求大丈夫,济人须济急时无。渴时一滴如甘露,醉后添杯不如无。

久住令人贱,频来亲也疏。酒中不语真君子,财上分明大丈夫。

出家如初,成佛有余。积金千两,不如明解经书。

养子不教如养驴,养女不教如养猪。有田不耕仓廪虚,有书不读子孙愚。

仓廪虚兮岁月乏,子孙愚兮礼仪疏。听君一席话,胜读十年书。

人不通今古,马牛如襟裾。茫茫四海人无数,哪个男儿是丈夫?

白酒酿成缘好客,黄金散尽为收书。救人一命,胜造七级浮屠。

城门失火,殃及池鱼。庭前生瑞草,好事不如无。

欲求生富贵,须下死工夫。百年成之不足,一旦坏之有余。

人心似铁,官法如炉。善化不足,恶化有余。

水至清则无鱼,人太急则无智。知者减半,愚者全无。

在家由父,出嫁从夫。痴人畏妇,贤女敬夫。

是非终日有,不听自然无。竹篱茅舍风光好,道院僧房终不如。

宁可正而不足,不可邪而有余。宁可信其有,不可信其无。

命里有时终须有,命里无时莫强求。道院迎仙客,书堂隐相儒。

庭栽栖凤竹,池养化龙鱼。结交须胜己,似我不如无。

但看三五日,相见不如初。人情似水分高下,世事如云任卷舒。

会说说都是,不会说无理。磨刀恨不利,刀利伤人指;

求财恨不多,财多害自己。知足常足,终身不辱;

知止常止,终身不耻。有福伤财,无福伤己。

差之毫厘,失之千里。若登高必自卑,若涉远必自迩。

三思而行,再思可矣。动口不如亲为,求人不如求己。

小时是兄弟,长大各乡里。嫉财莫嫉食,怨生莫怨死。

人见白头嗔,我见白头喜。多少少年郎,不到白头死。

墙有缝,壁有耳。好事不出门,坏事传千里。

若要人不知,除非己莫为。为人不做亏心事,半夜敲门心不惊。

贼是小人,智过君子。君子固穷,小人穷斯溢矣。

富贵多忧,贫穷自在。不以我为德,反以我为仇。

宁可直中取,不可曲中求。人无远虑,必有近忧。

知我者谓我心忧,不知我者谓我何求?

晴天不肯去,直待雨淋头。成事莫说,覆水难收。

是非只为多开口,烦恼皆因强出头。忍得一时之气,免得百日之忧。

近来学得乌龟法,得缩头时且缩头。惧法朝朝乐,欺公日日忧。

人生一世,草长一春。黑发不知勤学早,转眼便是白头翁。

月过十五光明少,人到中年万事休。儿孙自有儿孙福,莫为儿孙做马牛。

人生不满百,常怀千岁忧。今朝有酒今朝醉,明日愁来明日忧。

路逢险处须回避,事到临头不自由。人贫不语,水平不流。

一家养女百家求,一马不行百马忧。有花方酌酒,无月不登楼。

三杯通大道,一醉解千愁。深山毕竟藏猛虎,大海终须纳细流。

惜花须检点,爱月不梳头。大抵选她肌骨好,不搽红粉也风流。

受恩深处宜先退,得意浓时便可休。莫待是非来入耳,从前恩爱反为仇。

留得五湖明月在,不愁无处下金钩。休别有鱼处,莫恋浅滩头。

去时终须去,再三留不住。忍一句,息一怒,饶一着,退一步。

三十不豪,四十不富,五十将来寻死路。生不认魂,死不认尸。

一寸光阴一寸金,寸金难买寸光阴。父母恩深终有别,夫妻义重也分离。

人生似鸟同林宿,大难来时各自飞。人善被人欺,马善被人骑。

人无横财不富,马无夜草不肥。人恶人怕天不怕,人善人欺天不欺。

善恶到头终有报,只盼来早与来迟。黄河尚有澄清日,岂能人无得运时?

得宠思辱,居安思危。念念有如临敌日,心心常似过桥时。

英雄行险道,富贵似花枝。人情莫道春光好,只怕秋来有冷时。

送君千里,终有一别。但将冷眼观螃蟹,看你横行到几时。

见事莫说,问事不知。闲事莫管,无事早归。

假缎染就真红色,也被旁人说是非。善事可做,恶事莫为。

许人一物,千金不移。龙生龙子,虎生虎儿。

龙游浅水遭虾戏,虎落平原被犬欺。一举首登龙虎榜,十年身到凤凰池。

十年寒窗无人问,一举成名天下知。酒债寻常处处有,人生七十古来稀!

养儿防老,积谷防饥。鸡豚狗彘之畜,无失其时,数口之家,可以无饥矣。

当家才知盐米贵,养子方知父母恩。常将有日思无日,莫把无时当有时。

树欲静而风不止,子欲养而亲不待。时来风送滕王阁,运去雷轰荐福碑。

入门休问荣枯事,且看容颜便得知。官清司吏瘦,神灵庙祝肥。

息却雷霆之怒,罢却虎豹之威。饶人算之本,输人算之机。

好言难得,恶语易施。一言既出,驷马难追。

道吾好者是吾贼,道吾恶者是吾师。路逢侠客须呈剑,不是才人莫献诗。

三人行必有我师焉。择其善者而从之,其不善者而改之。

欲昌和顺须为善,要振家声在读书。少壮不努力,老大徒伤悲。

人有善愿,天必佑之。莫饮卯时酒,昏昏醉到酉。

莫骂酉时妻,一夜受孤凄。种麻得麻,种豆得豆。

天眼恢恢,疏而不漏。见官莫向前,作客莫在后。

宁添一斗,莫添一口。螳螂捕蝉,岂知黄雀在后?

不求金玉重重贵,但愿儿孙个个贤。一日夫妻,百世姻缘。

百世修来同船渡,千世修来共枕眠。杀人一万,自损三千。

伤人一语,利如刀割。枯木逢春犹再发,人无两度再少年。

未晚先投宿,鸡鸣早看天。将相顶头堪走马,公候肚内好撑船。

富人思来年,穷人想眼前。

世上若要人情好,赊去物品莫取钱。

生死有命,富贵在天。

击石原有火,不击乃无烟。

人学始知道,不学亦徒然。

莫笑他人老,终须还到老。

和得邻里好,犹如拾片宝。但能守本分,终身无烦恼。

大家做事寻常,小家做事慌张。大家礼义教子弟,小家凶恶训儿郎。

君子爱财,取之有道。贞妇爱色,纳之以礼。

善有善报,恶有恶报。不是不报,时候未到。

万恶淫为首,百行孝当先。人而无信,不知其可也。

一人道虚,千人传实。凡事要好,须问三老。

若争小利,便失大道。家中不和邻里欺,邻里不和说是非。

年年防饥,夜夜防盗。学者是好,不学不好。

学者如禾如稻,不学如草如蒿。遇饮酒时须防醉,得高歌处且高歌。

因风吹火,用力不多。不因渔夫引,怎能见波涛?

无求到处人情好,不饮任他酒价高。知事少时烦恼少,识人多处是非多。

进山不怕伤人虎,只怕人情两面刀。强中更有强中手,恶人须用恶人磨。

会使不在家富豪,风流不用衣着佳。光阴似箭,日月如梭。

天时不如地利,地利不如人和。黄金未为贵,安乐值钱多。

为善最乐,作恶难逃。羊有跪乳之恩,鸦有反哺之情。

孝顺还生孝顺子,忤逆还生忤逆儿。不信但看檐前水,点点滴滴旧窝池。

隐恶扬善,执其两端。妻贤夫祸少,子孝父心宽。

已覆之水,收之实难。人生知足时常足,人老偷闲且是闲。

处处绿杨堪系马,家家有路通长安。既坠釜甑,反顾何益。

见者易,学者难。厌静还思喧,嫌喧又忆山。

自从心定后,无处不安然。莫将容易得,便作等闲看。

用心计较般般错,退后思量事事宽。道路各别,养家一般。

由俭入奢易,从奢入俭难。知音说与知音听,不是知音莫与谈。

点石化为金,人心犹未足。信了赌,卖了屋。

他人观花,不涉你目。他人碌碌,不涉你足。

谁人不爱子孙贤,谁人不爱千钟粟。奈五行,不是这般题目。

莫把真心空计较,儿孙自有儿孙福。书到用时方恨少,事非经过不知难。

天下无不是的父母,世上最难得者兄弟。

与人不和,劝人养鹅;与人不睦,劝人架屋。

但行好事,莫问前程。不交僧道,便是好人。

河狭水激,人急计生。明知山有虎,莫向虎山行。

路不铲不平,事不为不成。无钱方断酒,临老始读经。

点塔七层,不如暗处一灯。堂上二老是活佛,何用灵山朝世尊。

万事劝人休瞒昧,举头三尺有神明。但存方寸土,留与子孙耕。

灭却心头火,剔起佛前灯。惺惺多不足,蒙蒙作公卿。

众星朗朗,不如孤月独明。兄弟相害,不如友生。

合理可作,小利不争。牡丹花好空入目,枣花虽小结实多。

欺老莫欺小,欺人心不明。勤奋耕锄收地利,他时饱暖谢苍天。

得忍且忍,得耐且耐,不忍不耐,小事成灾。

相论逞英豪,家计渐渐退。贤妇令夫贵,恶妇令夫败。

一人有庆,兆民咸赖。人老心未老,人穷志莫穷。

人无千日好,花无百日红。黄蜂一口针,橘子两边分。

世间痛恨事,最毒淫妇心。杀人可恕,情理不容。

乍富不知新受用,乍贫难改旧家风。座上客常满,杯中酒不空。

屋漏更遭连夜雨,行船又遇打头风。笋因落箨方成竹,鱼为奔波始化龙。

记得少年骑竹马,转眼又是白头翁。礼义生于富足,盗贼出于赌博。

天上众星皆拱北,世间无水不朝东。士为知己者死,女为悦己者容。

色即是空,空即是色。君子安贫,达人知命。

良药苦口利于病,忠言逆耳利于行。顺天者昌,逆天者亡。

有缘千里来相会,无缘对面不相逢。有福者昌,无福者亡。

人为财死,鸟为食亡。夫妻相和好,琴瑟与笙簧。

红粉易妆娇态女,无钱难作好儿郎。有子之人贫不久,无儿无女富不长。

善必寿老,恶必早亡。爽口食多偏作病,快心事过恐遭殃。

富贵定要依本分,贫穷不必再思量。画水无风空作浪,绣花虽好不闻香。

贪他一斗米,失却半年粮。争他一脚豚,反失一肘羊。

龙归晚洞云犹湿,麝过春山草木香。平生只会说人短,何不回头把己量?

见善如不及,见恶如探汤。人穷志短,马瘦毛长。

自家心里急,他人未知忙。贫无达士将金赠,病有高人说药方。

触来莫与竞,事过心清凉。秋来满山多秀色,春来无处不花香。

凡人不可貌相,海水不可斗量。

清清之水为土所防,济济之士为酒所伤。

蒿草之下或有兰香,茅茨之屋或有侯王。

无限朱门生饿殍,几多白屋出公卿。酒里乾坤大,壶中日月长。

拂石坐来春衫冷,踏花归去马蹄香。万事前身定,浮生空自忙。

叫月子规喉舌冷,宿花蝴蝶梦魂香。一言不中,千言不用。

一人传虚,百人传实。万金良药,不如无疾。千里送鹅毛,礼轻情义重。

世事如明镜,前程暗似漆。君子怀刑,小人怀惠。

架上碗儿轮流转,媳妇自有做婆时。

人生一世,如驹过隙。良田万顷,日食一升。

大厦千间,夜眠八尺。千经万典,孝义为先。

天上人间,方便第一。一字入公门,九牛拔不出。

八字衙门向南开,有理无钱莫进来。

欲求天下事,须用世间财。富从升合起,贫因不算来。

近河不得枉使水,近山不得枉烧柴。家无读书子,官从何处来?

慈不掌兵,义不掌财。一夫当关,万夫莫开。

万事不由人计较,一生都是命安排。白云本是无心物,却被清风引出来。

慢行急行,逆取顺取。命中只有如许财,丝毫不可有闪失。

人间私语,天闻若雷。暗室亏心,神目如电。

一毫之恶,劝人莫作。一毫之善,与人方便。

亏人是祸,饶人是福,天眼恢恢,报应甚速。

圣贤言语,神钦鬼服。人各有心,心各有见。

口说不如身逢,耳闻不如目见。见人富贵生欢喜,莫把心头似火烧。

养兵千日,用在一时。国清才子贵,家富小儿娇。

利刀割体疮犹使,恶语伤人恨不消。

公道世间唯白发,贵人头上不曾饶。

有才堪出众,无衣懒出门。为官须作相,及第必争先。

苗从地发,树由枝分。宅里燃火,烟气成云。

以直报怨,知恩报恩。红颜今日虽欺我,白发他时不放君。

借问酒家何处有,牧童遥指杏花村。父子和而家不退,兄弟和而家不分。

一片云间不相识,三千里外却逢君。官有公法,民有私约。

平时不烧香,临时抱佛脚。幸生太平无事日,恐防年老不多时。

国乱思良将,家贫思良妻。池塘积水须防旱,田地深耕足养家。

根深不怕风摇动,树正何愁月影斜。争得猫儿,失却牛脚。

愚者千虑,必有一得,智者千虑,必有一失。

始吾于人也,听其言而信其行。今吾于人也,听其言而观其行。

哪个梳头无乱发,情人眼里出西施。珠沉渊而川媚,玉韫石而山辉。

夕阳无限好,只恐不多时。

久旱逢甘霖,他乡遇故知;洞房花烛夜,金榜题名时。

惜花春起早,爱月夜眠迟。掬水月在手,弄花香满衣。

桃红李白蔷薇紫,问着东君总不知。教子教孙须教义,栽桑栽柘少栽花。

休念故乡生处好,受恩深处便为家。学在一人之下,用在万人之上。

一日为师,终生为父。忘恩负义,禽兽之徒。

劝君莫将油炒菜,留与儿孙夜读书。书中自有千钟粟,书中自有颜如玉。

莫怨天来莫怨人,五行八字命生成。

莫怨自己穷,穷要穷得干净;莫羡他人富,富要富得清高。

别人骑马我骑驴,仔细思量我不如,

待我回头看,还有挑脚汉。路上有饥人,家中有剩饭。

积德与儿孙,要广行方便。作善鬼神钦,作恶遭天遣。

积钱积谷不如积德,买田买地不如买书。

一日春工十日粮,十日春工半年粮。

疏懒人没吃,勤俭粮满仓。人亲财不亲,财利要分清。

十分伶俐使七分,常留三分与儿孙,

若要十分都使尽,远在儿孙近在身。

君子乐得做君子,小人枉自做小人。

好学者则庶民之子为公卿,不好学者则公卿之子为庶民。

惜钱莫教子,护短莫从师。记得旧文章,便是新举子。

人在家中坐,祸从天上落。但求心无愧,不怕有后灾。

只有和气去迎人,哪有相打得太平。忠厚自有忠厚报,豪强一定受官刑。

人到公门正好修,留些阴德在后头。为人何必争高下,一旦无命万事休。

山高不算高,人心比天高。白水变酒卖,还嫌猪无糟。

贫寒休要怨,宝贵不须骄。善恶随人作,祸福自己招。

奉劝君子,各宜守己。只此呈示,万无一失。