python正则表达式
Python正规表达式的历史

Python 最初的正则表达式支持支持 Posix 扩展语法,可以使用 UNIXv8 正则表达式或 Henry Spencer 的重新配置(其中包含了其一个版本)。这在 Python 0.9.1 中已有。该版本仅对 Python 0.9.0 的首次公开源代码版本进行了细微修改。Python 0.9.1 发布于 Usenet alt.sources,因此保存在档案中(之前 python.org 上提供过 tarball 转换版本,legacy.python.org 上仍然存在。 其中 Guido van Rossum和 Henry Spencer 有必要说明下。
关于Guido van Rossum
吉多·范罗苏姆(Guido van Rossum)是荷兰的计算机程序员,以创造Python程序设计语言而闻名。他在Python社区被尊称为“仁慈的独裁者”(BDFL),这意味着他仍然密切关注Python的发展,
并在关键时刻做出决策。范罗苏姆曾在Google工作,将一半的时间投入到Python的维护中。
范罗苏姆1956年出生于荷兰,1982年在阿姆斯特丹大学获得数学和计算机科学硕士学位。他曾在多个研究机构工作,包括荷兰国家数学与计算机科学研究中心(CWI),
美国国家标准及技术研究所(NIST),以及国家创新研究公司(CNRI)。
自 Python 诞生以来,Guido 一直积极参与 Python 的开发。短暂退休后,他重返工作岗位。Microsoft雇佣了他,2020年,他宣布加入微软的DevDiv团队
他的主要工作重点是提升Python的速度。
1987年,Guido在荷兰国家数学与计算机科学研究机构CWI参与了大型分布式作系统的开发工作。在那个项目中,他有一定的自由去做副项目。
凭借他此前在一种名为ABC的计算机语言中积累的知识和经验,他开始编写Python编程语言。
1995年,他移居美国,并在2005年加入Google,为其编写了基于Python的网页代码浏览工具。 范罗苏姆因其对Python的贡献获得了多项荣誉,包括2001年自由软件进步奖,荷兰UNIX用户小组奖,以及被美国计算机协会(ACM)认定为著名工程师。他的工作不仅推动了Python语言的发展,
也对开源软件社区产生了深远影响。 Python语言的命名来源于英国喜剧《蒙提·派森的飞行马戏团》(Monty Python and the Flying Circus),这反映了范罗苏姆的幽默感和对编程的轻松态度。
他的个性和对Python的贡献使他在全球编程社区中享有极高的声誉。 范罗苏姆的简历中有趣的一点是,他曾在Google面试时仅用一句话表明自己的身份:“I wrote Python”,这足以显示他在编程界的地位。
尽管有传言称面试官在面试多轮后才意识到他是Python的创造者,但这种说法的真实性存疑。不管怎样,范罗苏姆对编程世界的贡献是不容置疑的。
关于Henry Spencer
查看 亨利·斯宾塞 - 维基百科
Henry Spencer(1955年生)是一位加拿大计算机程序员和太空爱好者。他编写了“正则表达式”,这是一个广泛使用的正则表达式软件库
1.book library 该内容最初于1986年1月19日发布在Usenet群组mod.sources,并于1994年为Dale Schumacher主编的《Software Solutions In C》一书更新[参考:Usenet]。
该版本从 zoo.toronto.edu 的FTP服务器(现已停用)获得。该人文页面日期为1996年9月5日,原始tar档案日期为1998年4月4日 2.第二个是“BSD库”。这是一个符合 POSIX.2 标准的库,包含在 4.4BSD Unix 中
该库可从 GitHub 仓库获取,或从发布档案中下载。 还有一个修改版本,带有 CMake 构建系统,也可以在 github 仓库或从发布档案中下载 3.第三个是“Tcl库”,于1999年加入Tcl(版本8.1),支持宽字符Unicode。
PCRE(Perl Compatible Regular Expressions)是一个由菲利普·海泽(Philip Hazel)编写的C语言编写的正则表达式函数库
Henry Spencer的regex库是一个广泛使用的C语言正则表达式库
https://gitee.com/opensource168/hs-regex 一个复制了 Henry Spencer 写的正则库的小系统
关于for循环的else(python早期)
for i in range(10): pass else: print('"for" has an "else"!')
参考: http://www.dalkescientific.com/writings/diary/archive/2009/03/27/python_0_9_1p1.html
| 字符 | 含意 |
| \ |
做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 |
| ^ | 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a" |
| $ | 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A" |
| * | 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa |
| + | 匹配前面元字符1次或多次,/ba+/将匹配ba,baa,baaa |
| ? | 匹配前面元字符0次或1次,/ba*/将匹配b,ba |
| (x) | 匹配x保存x在名为$1...$9的变量中 |
| x|y | 匹配x或y |
| {n} | 精确匹配n次 |
| {n,} | 匹配n次以上 |
| {n,m} | 匹配n-m次 |
| [xyz] | 字符集(character set),匹配这个集合中的任一一个字符(或元字符) |
| [^xyz] | 不匹配这个集合中的任何一个字符 |
| [\b] | 匹配一个退格符 |
| \b | 匹配一个单词的边界 |
| \B | 匹配一个单词的非边界 |
| \cX | 这儿,X是一个控制符,/\cM/匹配Ctrl-M |
| \d | 匹配一个字数字符,/\d/ = /[0-9]/ test="this 56 is 35 " reg.match("\d",test) #匹配 5,6,3,5 等价于下面 test="this 56 is 35 " |
| \D | 匹配一个非字数字符,/\D/ = /[^0-9]/ |
| \n | 匹配一个换行符 |
| \r | 匹配一个回车符 |
| \s | 匹配一个空白字符,包括\n,\r,\f,\t,\v等 |
| \S | 匹配一个非空白字符,等于/[^\n\f\r\t\v]/ |
| \t | 匹配一个制表符 |
| \v | 匹配一个重直制表符 |
| \w | 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9] |
| \W | 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。 |
|
用re = new RegExp("pattern",["flags"]) 的方式比较好 |
vaScript动态正则表达式问题
请问正则表达式可以动态生成吗? |
|
一、.*?和(.*?)的区别
#某个标签内的内容,标签可能是嵌套的 msg = "<div>this</div>is<div>my dog</div>" ret = re.findall("<div>.*?</div>",msg) print(ret) #['<div>this</div>', '<div>my dog</div>'] #提取标签内的内容 msg = "<div>this</div>is<div>my dog</div>" ret = re.findall("<div>(.*?)</div>",msg) print(ret) #['<div>this</div>', '<div>my dog</div>']
二、比较一下贪婪和非贪婪模式的区别
#贪婪正则 (.*) #非贪婪正则 (.*?)
1)例1 贪婪(.*)和非贪婪(.*?)区别
#贪婪匹配会尽可能多地匹配字符。例如: import re sentence = r'中国人民 "站" 起 "来" 了.' result = re.findall(r'"(.*)"', sentence) print(result)
#['站" 起 "来']
#正则表达式 "(.*)" 匹配了从第一个引号到最后一个引号之间的内容 #非贪婪匹配会尽可能少地匹配字符。例如: import re sentence = '中国人民 "站" 起 "来" 了.' result = re.findall(r'"(.*?)"', sentence) print(result) #输出结果: ['站', '来'] #在这个例子中,正则表达式 "(.*?)" 只匹配了每对引号之间的内容。
2)例2 非贪婪模式: .*?和(.*?)区别
#提取标签和标签内的内容,"的成败在于"将被丢弃
testtext = "<li>我</li>的成败在于<li>你</li>"
ret = re.findall("<li>.*?</li>",testtext)
print(ret)
#输出 ['<li>我</li>', '<li>你</li>']
#<li>.*?</li>匹配模式意思为:将匹配标签和标签内的内容
#只提取标签内的结果
testtext = "<li>我</li>bb<li>你</li>"
ret = re.findall("<li>(.*?)</li>",testtext)
print(ret)
#输出结果: ['我', '你']
3)贪婪模式 .*
testtext = (r"<div>"
"<li>我</li>"
"<li>有</li>"
"<li>你</li>"
"</div>")
ret = re.findall("<li>.*</li>", testtext)
print(ret)
#输出: ['<li>我</li><li>有</li><li>你</li>']
#<li>.*</li> 将匹配最外层的即上面红色标签和标签内的内容(他适合比较粗粒度的处理,大段大段的处理数据,精细化还是要非贪婪模式)
4) findall和search处理
#匹配标签对以及内容
msg = "<div>中国</div>人民<div>做主</div>"
ret = re.findall("<div>.*?</div>",msg)
print(ret)
#['<div>中国</div>', '<div>做主</div>']
print("---------通配符---------")
#非贪婪模式,提取到<meta></meta>之间的数据
testtxt = "<html><meta>中国</meta></html>"
x = re.search(r"<meta>(.*?)</meta>", testtxt)
print(x.group(0)) #<meta>中国</meta>
print(x.group(1)) #中国
参考
https://www.infoq.cn/article/2011/07/regular-expressions-6-POSIX/
https://docs.python.org/3/library/re.html
https://legacy.python.org/download/releases/early/Python-0.9.1.tar.gz
https://www.python.org/ftp/python/src/Python-0.9.1.tar.gz
https://github.com/smontanaro/python-0.9.1 (github上的0.9.1版本)
https://garyhouston.github.io/regex/
https://python.land/python-tutorial
https://www.python.org/download/releases/early/ (早期版本)
https://docs.python.org/3/library/ 官方库介绍
https://docs.python.org/3/tutorial/index.html 官方教程入口
https://github.com/google-gemini/deprecated-generative-ai-python (已废弃)
https://github.com/googleapis/python-genai (Google AI Python SDK 最新)
https://wiki.python.org/moin/BeginnersGuide/Mathematics (python的数学科学 wiki)
https://scipy.org/
https://groups.google.com/g/alt.sources/c/Dl7XnUUbLik/m/2tWvvDwnOyEJ
https://blog.finxter.com/machine-learning-cheat-sheets/ (机器学习)
https://wiki.python.org/moin/BeginnersGuide/Programmers?action=AttachFile&do=view&target=Cpp2Python.pdf
https://github.com/basis-technology-corp/tcl-regex-java
https://garyhouston.github.io/regex/
https://swtch.com/~rsc/regexp/regexp1.html
https://swtch.com/~rsc/regexp/(这里收集了一些正则的算法效率问题)
https://regex101.com/(在线debug 正则表达式,非常不错)

浙公网安备 33010602011771号