如何使用正则表达式和 Python 匹配不以模式开头的字符串
需要在 Python 中使用正则表达式来匹配不以给定模式开头的字符串吗?
如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https 开始的字符串。
在这个例子中,我们有一个 URL 的列表。假设你想得到所有不以https 开始的网址。
为了这个目的,我们将使用负数查找。
其结果是。
它是如何工作的?
- ^ – 断定位置在字符串的开头
- (?!https) – 负向查找 – 断言重码不匹配 – https
- .* – 匹配0到无限次之间的任何字符
现在,让我们试着找到所有不以……开头的字符串。
- https
- ftp
我们可以使用| ,也就是在regex语法中 -r\”^(?!https|ftp).*\” 。
结果是。
[][\’http://en..org/wiki/National_Park_Service/\’] [][\’http://en..org/wiki/United_States_Bureau_of_Reclamation/\’]
[][\’en..org/wiki/Africa/\’ ][]
注意:你可以用| 添加许多模式。
最后让我们看看如何匹配所有不以几个字符开头的字符串,比如。
- f
- h
这次我们要列出方括号内的所有字符:[^hf] 。语句[hf] 意味着匹配字母 -f 或h ,而^ 则否定匹配。
换句话说,匹配列表中不存在的单个字符 -[hf] 。
所以我们可以使用。
这将给我们带来。
在python中使用正则表达式及9个核心匹配函数用法示例
正则表达式的功能:
- 对字符有规律的查询和排除。
- 使用正则表达式时,都使用原生字符串表达,即用r 或 R 开头。
功能:获取正则表达式对象
语法:compile( pattern , flags = 0 )
属性:
- pattern:正则表达式
- groupindex :捕获组:(调用组)形成字典
- groups:多个子组
- flags可选 :标志位:
- I / IGNORECASE:忽略大小写
- A / ASCII:对\\w,\\W,\\b,\\B,\\d,\\D,\\s,\\S,只进行ASCII匹配(python3.x版本)。
- M / MULTILINE:将^ 和 $用于整个字符串开始和结尾的每一行(默认情况下,仅适用于整个字符串的开始和结尾处)。
- S / DOTALL:使用 . 字符时匹配所有字符,包括换行符。
- X / VERBOSE:忽略模式字符串中未转义的空格和注释。
示例:
示例:
功能:通过正则表达式匹配字符串,以列表返回,没有返回:[ ]
语法:. findall ( string , pos , endpos )
- string:目标字符串
- pos:目标字符串匹配的开始位置
- endpos:目标字符串匹配的结束位置
子组:如果正则表达式有子组,则只显示子组
示例:
示例:
功能:使用正则表达式匹配目标内容,返回迭代 match 对象
语法:. finditer ( pattern , string ,flags = 0 )
- pattern:模式字符串,由正则表达式转换而来
- string:要匹配的字符串
- flags:可选 :标志位
示例:
功能:
- 匹配字符串开头,匹配返回 match 对象,否则 None
- 通常使用try处理异常
语法:. match ( pattern , string [ , flags ] )
- pattern : 模式字符串,由正则表达式转换而来
- string : 要匹配的字符串
- flags : 可选 :标志位,用于控制匹配方式:
I / IGNORECASE
功能:不区分大小写。
示例:
M / MULTILINE
功能:行开头和结尾,将^ 和 $用于整个字符串开始和结尾的每一行(默认情况下,仅适用于整个字符串的开始和结尾处)。
示例:
S / DOTALL
功能:使用 . 字符时匹配所有字符,包括换行符。
示例:
X / VERBOSE
功能:忽略正则表达式中的注释和空格。
示例:
A / ASCII
- 对\\w,\\W,\\b,\\B,\\d,\\D,\\s,\\S,只进行ASCII匹配(python3.x版本)。
- 多个标志使用:re.I | re.X | re.S | re.M
示例:
功能:匹配一个字符串,返回mathc对象,否则None,只能匹配一处
语法:. search ( pattern , string )
pattern :模式字符串,由正则表达式转换而来
string:目标字符串
示例:
拓展:match对象属性
功能:完全匹配
语法:. fullmatch ( pattern ,strint )
pattern :模式字符串,由正则表达式转换而来
string:目标字符串
示例:
功能:根据正则表达式切割目标字符串
语法:. split( string )
string:目标字符串
示例:
功能:替换正则表达式匹配到的内容
语法:. sub( replaceStr , string ,max )
replaceStr:要替换的内容
string:目标字符串
max:最多替换几处
示例:
功能:替换正则表达匹配的内容,及替换个数
语法:. subn ( repl , string , count )
repl :要替换的内容
string:目标字符串
count:最多 替换几处
示例:
示例:
- 中文字符:[\\u4e00-\\u9fa5]
- 双字节字符:[^\\x00-\\xff]
- 邮箱地址:\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}
- 网络地址:^((https|http|ftp|rtsp|mms)?:\\/\\/)[^\\s]+
- 国内手机:0?(13|14|15|17|18|19)[0-9]{9}
- 国内座机:[0-9-()()]{7,18}
- 负浮点数:-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*)
- 正浮点数:[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*
- 腾讯QQ:[1-9]([0-9]{5,11})
- IP地址:(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)
- 身份证号:\\d{17}[\\d|x]|\\d{15}
- 日期格式:\\d{4}(\\-|\\/|.)\\d{1,2}\\1\\d{1,2}
- 用户名称:[A-Za-z0-9_\\-\\u4e00-\\u9fa5]+
在python中使用正则表达式及9个核心匹配函数用法示例
js中的正则表达式入门
什么是正则表达式呢?
正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、将匹配的子串做替换或者从某个字符串中取出符合某个条件的子串等。
说白了正则表达式就是处理字符串的,我们可以用它来处理一些复杂的字符串。
为什么要学习正则表达式
我们直接用一个例子来说明
通过比较2种方法我们明显看出在对字符串进行处理时,使用正则表达式会简单许多,所以虽然正则表达式看起来像是火星文一样的一堆乱码的东西,但我们还是有必要去学习它的。
正则表达式的创建方式
- 字面量创建方式
- 实例创建方式
字面量创建方式和构造函数创建方式的区别
- 字面量创建方式不能进行字符串拼接,实例创建方式可以
- 字面量创建方式特殊含义的字符不需要转义,实例创建方式需要转义
元字符
代表特殊含义的元字符
代表次数的量词元字符
量词出现在元字符后面 如\\d+,限定出现在前面的元字符的次数
正则中的()和[]和重复子项 //拿出来单独说一下
- 一般[]中的字符没有特殊含义 如+就表示+但是像\\w这样的还是有特殊含义的
- []中,不会出现两位数
- ()的提高优先级功能:凡是有|出现的时候,我们一定要注意是否有必要加上()来提高优先级;
- ()的分组 重复子项 (两个放到一起说)
- 当我们加()只是为了提高优先级而不想捕获小分组时,可以在()中加?:来取消分组的捕获
正则运算符的优先级
- 正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
- 相同优先级的会从左到右进行运算,不同优先级的运算先高后低。
正则的特性
- 贪婪性
所谓的贪婪性就是正则在捕获时,每一次会尽可能多的去捕获符合条件的内容。如果我们想尽可能地少的去捕获符合条件的字符串的话,可以在量词元字符后加?
- 懒惰性
懒惰性则是正则在成功捕获一次后不管后边的字符串有没有符合条件的都不再捕获。如果想捕获目标中所有符合条件的字符串的话,我们可以用标识符g来标明是全局捕获
和正则相关的一些方法
这里我们只介绍test、exec、match和replace这四个方法
- reg.test(str) 用来验证字符串是否符合正则 符合返回true 否则返回false
- reg.exec() 用来捕获符合规则的字符串
当我们用exec进行捕获时,如果正则没有加\’g\’标识符,则exec捕获的每次都是同一个,当正则中有\’g\’标识符时 捕获的结果就不一样了,我们还是来看刚刚的例子
exec的捕获还受分组()的影响
- str.match(reg) 如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null
上边两个方法console的结果有什么不同呢?二个字符串是一样滴。当我们进行全局匹配时,二者的不同就会显现出来了.
当全局匹配时,match方法会一次性把符合匹配条件的字符串全部捕获到数组中,如果想用exec来达到同样的效果需要执行多次exec方法。
我们可以尝试着用exec来简单模拟下match方法的实现。
此外,match和exec都可以受到分组()的影响,不过match只在没有标识符g的情况下才显示小分组的内容,如果有全局g,则match会一次性全部捕获放到数组中
- str.replace() 这个方法大家肯定不陌生,现在我们要说的就是和这个方法和正则相关的东西了。
通过replace方法获取url中的参数的方法
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。