

python 正则匹配任意字符的一个坑
source link: https://www.hawu.me/coding/2723
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

错误: .*
是匹配除了换行符\n
以外的所有字符。
正确: 正确匹配任意字符的表达式应该是 [\s\S]*
或 [\d\D]*
或 [\w\W]*
。(中括号 []
表示字符集合,匹配集合中的任意字符。)
错误: 另一种错误表达式是 (.|\s)*
。这个乍一看是没有问题的,但在执行 findall()
匹配的时,可能会遇到无法终止的情况。举一个例子看看:
#!/usr/bin/python2 # -*- coding: utf-8 -*- import re content = """ START hello, world. 123 hello, world. 123 hello, world. 123 hello, world. 123 hello, world. 123 hello, world. 123 hello, world. 123 hello, world. 123 hello, world. 123 hello, world. 123 """ # 匹配以START开始,END结尾,中间任意字符的字符串。 # 其中 (?: ) 表示不是捕获括号内的内容。因为正则匹配遇到括号后,默认会只去捕获括号内匹配的内容 # 其中 (.|s)+? 就是我以为可以用来匹配任意字符的错误用法 result = re.findall(ur"START(?:.|\s)+?END", content) print(result)
上诉例子就会陷入“卡死”的状态。
如果将 content 字符串用 START ... END 闭合,findall 可以正常识别出内容;
如果将 content 字符串的内容减少一点,比如只留下 "START hello, world.",findall 也能很快返回无可匹配内容;
而像上面这样,字符串一长点,并且未闭合的话,findall 就会陷入“卡死”状态。。。。
正确的做法就是把 "START(?:.|\s)+?END"
改成 "START[\s\S]+?END"
。
蛤?你说为什么会这样?。。。我也不知道 🤷♂️
Recommend
-
27
网上看过不少代码的教程,有些按照步骤来一段段代码解读 (篇幅会很长) ,有些会简化代码来讲解,然后逐步扩展 (篇幅也会很长) ,有些干脆直接源代码放出来,在上面注解。...
-
10
用正则表达式匹配3的任意倍数 2019-10-21 分类:算法 /
-
9
给 Python 的正则匹配限制执行时间 本文来自依云's Blog,转...
-
6
Python爬虫编程思想(29):正则表达式的匹配(match)与搜索(search) ...
-
7
第一章 正则表达式字符匹配攻略正则表达式是匹配模式,要么匹配字符,要么匹配位置。请记住这句话。 然而关于正则如何匹配字符的学习,大部分人都觉得这块比较杂乱。 毕竟元字符太多了,看起来没有系统性,不好记。本章就解决这个问题。...
-
9
V2EX › Python re.split()分割正则匹配问题(保留字符?) uti6770werty · 20 小...
-
7
Python高级(20)—正则表达式简介,匹配字符串及预编译◎知识点正则表达式的简介使用re模块实现字符串的匹配正则表达式的预编...
-
13
Python高级(21)—单个字符的匹配、正则表达式与原始字符串◎知识点单个字符的匹配正则表达式与原始字符串◎脚本练习...
-
8
Python高级(22)—正则表达式匹配◎知识点贪婪匹配与勉强匹配分组匹配逻辑匹配◎脚本练习
-
4
Python高级(25)—正则边界匹配、Match对象的属性和方法◎知识点正则表达式边界匹配Match对象的属性和方法◎脚本练习
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK