你好,这里是西赛德李

现在写的东西还很少,请见谅

python3 json.loads() json.dumps() 中对于单引号、双引号、转义符的问题

其实里面最容易迷惑的,就是代码里的字符串与真实字符串的区别。在代码里需要用单引号或双引号将字符串包裹起来,这样一来就必须使用转义符,但是真实的字符串(例如你存入数据库的字符串)又是转义后的。上面看起来像是一段废话,但我认为确是主要矛盾。 考虑这样一个场景:你在数据库中用 text 类型存放 JSON 对象(JSON 对象默认都用双引号包裹字符串),你想要取出来做些修改再存进去。 假设数据库中存储的字符串是这样 {"id":1,"name": "le\"ee'e"}(为了与数据库中的形式保持一致,我这里没用引号包裹整个字符串),并赋值给变量 target 然后首先 json.loads(target) 一下,会得到如下的 JSON 对象 { "id": 1, "name": "le\"ee'e" } 给它随便做些修改,比如新增一个字段 extra,然后 target 就变成这样 { "id": 1, "name": "le\"ee'e", "extra": "something" } 最后要把它存入数据库,一般直接用 cursor.execute(),这个时候问题就来了,你会写出下面像这样的语句 cursor.execute("UPDATE table_name SET column_name = '%s' WHERE id = 1" % json.dumps(target)) 或者你更习惯用单引号 cursor.execute('UPDATE table_name SET column_name = "%s" WHERE id = 1' % json.dumps(target)) 上面的 sql 语句打印出来如下 UPDATE table_name SET column_name = '{"id": 1, "name": "le\"ee'e", "extra": "something"}' WHERE id = 1 UPDATE table_name SET column_name = "{"id": 1, "name": "le\"ee'e", "extra": "something"}" WHERE id = 1 可以看出,无论哪种都会导致 sql 报错,要想正确存入数据库,需要将对应符号都进行转义 cursor....

September 2, 2021

JavaScript 正则表达式 `exec`、`match`、`matchAll`、`test` 方法详解

关于正则编写的细节这里不多做赘述,本文主要是列出 exec、match、matchAll、test 这几个函数之间的区别。 详细的正则表达式文档参照 正则表达式 - JavaScript | MDN exec 函数 调用者:正则表达式 返回示例 属性 描述 [0]、[1]、[2]… 下标 0 对应的是最近一个匹配到的字符串,往后的下标对应捕获的子串(也就是正则表达式里用括号包裹的内容) index 此次匹配到的字符串在原始字符串中的索引值 input 原始字符串 当正则表达式携带 g 标志时,exec 函数会从正则表达式变量的 lastIndex(默认为 0)起开始检索原始字符串,一旦匹配成功就会停止继续向后匹配,并会在执行后把正则表达式变量的 lastIndex 值置成此次匹配的子串末尾的下标 + 1(如果匹配成功),或置回 0(如果匹配失败)。这就会导致多次执行 exec 可能会有不同的结果,像下面这样: let myRe = /d(b+)(c*)d/g; let str = 'cdbbcdbsbzdbd'; myRe.exec(str); // 第 1 次执行结果 => ["dbbcd", "bb", "c", index: 1, input: "cdbbcdbsbzdbd"] // 上面结果中的 "bb" 就是第一个括号捕获的内容,"c" 就是第二个括号捕获的内容 // 执行完后 myRe.lastIndex 为 6,下一次 exec 将从原始字符串下标 6 开始检索 myRe....

December 4, 2020

SSH Key 的 config 文件

今天在新电脑 XPS 15 上移植自己的 Hexo 博客,原本是很简单的事情,结果弄了两个多小时,就是因为 hexo d 部署的时候一直说验证不通过。 记录一下主要步骤如下: 保证本地电脑上有 SSH Key 文件,并且已经在网站设置中添加好。这里网站可以是 Github 或其他远程代码仓库网站。我用的是微软的 VSTS。 编辑 ~/.ssh/config,添加: Host vs-ssh.visualstudio.com HostName vs-ssh.visualstudio.com User git IdentityFile ~/.ssh/id_rsa_vsts 接下来就可以使用 hexo d 命令了,没有设置过用户信息的话它还会让你设置 email,用它提示的 git config 命令就可以,如果在这里的信息不是你常用的,记得把 --global 去掉

November 28, 2018

厕所需要有几个小便池问题

在知乎上看到了一个回答,很有意思,原文链接 有没有什么男生才能看懂的笑话? 把文中的问题转换成一个编程题目: 一个公厕有一排小便池,现在有 n 个男人依次进去小便,假设第一个进去的人必定挑选最边上的小便池,后来进来的人挑选小便池遵循以下原则: 1、离我最近的人要离我尽可能地远 2、绝对不能接受和别人用相邻的小便池 假设整个过程中途没有人离开,为了让这 n 个男人能一起在这个公厕小便,那么这个公厕至少需要几个小便池? 写一个函数,接收人数 n 作为参数,返回至少需要的小便池个数。 这个题目中 依次进去 这个条件很关键,比如在 4 个人的情况时,至少需要 8 个小便池,7 个就不行。 我把题目发给室友看后,室友给出了一个递归倒推的方法,即:计算 m 个小便池最多能容纳多少人。 令 max_people(m) 表示 m 个小便池最多能容纳的人数,那么有: m 为偶数时,max_people(m) = max_people(m / 2) + max_people(m / 2 + 1) - 1 m 为奇数时,max_people(m) = 2 * max_people((m + 1) / 2) - 1

May 8, 2018

计算连续次幂的个位数

前两天在 codewars 上做到一道题,题目本身不是很难,但是有一个解法十分厉害,一定要写一篇博客说一下。 原题 For a given list [x1, x2, x3, ..., xn] compute the last (decimal) digit of x1 ^ (x2 ^ (x3 ^ (... ^ xn))). E. g., last_digit([3, 4, 2]) == 1 because 3 ^ (4 ^ 2) = 3 ^ 16 = 43046721. Beware: powers grow incredibly fast. For example, 9 ^ (9 ^ 9) has more than 369 millions of digits. lastDigit has to deal with such numbers efficiently....

February 14, 2018