正则表达式实现跨行匹配

摘要:
正则表达式可用于检查文本是否包含指定模式的字符串。它通常按行处理,因为运算符通常不匹配换行符。如何处理匹配多行?本文介绍了正则表达式跨行匹配的实现。目录1.sed命令删除多行2.Python正则表达式匹配多行① 重新。DOTALL或re。S参数② 表达式(.||)*③ 表达式[sS]*④ expression(?D;};}‘test.txt2.Python正则表达式匹配多行Python中匹配多行的方法如下:① 重新。DOTALL或re。S参数importRedata=“1startest1test2end2”reg1=r“start.*end”reg2=r“start(.*)end”res1=re。findallprintres2=re。findallprint执行结果:['stest1test2end']['test1test2']② 表达式(.||)*importredata=“1startest1test2end2”reg3=r“start”res=re Findallprint执行结果:[]③ 表达式[sS]*importRedata=“1startest1test2end2”reg4=r“start”res=re。Findallprint执行结果:['test1test2']④ 表达式(?

正则表达式(Regular expression)可用来检查文本中是否包含指定模式的字符串,通常是按行来处理(POSIX标准),因为.操作符通常不匹配换行符,如果要匹配多行怎么处理呢?本文介绍正则表达式跨行匹配实现方法。

目录

1. sed 命令删除多行

测试文档test.txt内容如下:

start
test1
test2
end

删除 startend 之间的内容

# 包括`start` 和 `end`
sed -i '/start/,/end/d' test.txt  

# 不包括`start` 和 `end`
sed -i '/start/,/end/{{//!d;};}' test.txt 
2. Python正则表达式匹配多行

Python中匹配多行方法如下:

re.DOTALL 或者 re.S 参数

import re

data = "1
start
test1
test2
end
2"

reg1 = r"start.*end"
reg2 = r"start(.*)end"
res1 = re.findall(reg1, data, flags=re.S)
print(res1)
res2 = re.findall(reg2, data, flags=re.DOTALL)
print(res2)

执行结果:

['start
test1
test2
end']
['
test1
test2
']

② 表达式 (.| | )*

import re
data = "1
start
test1
test2
end
2"

reg3 = r"start((.|
|
)*)end"
res = re.findall(reg3, data)
print(res)

执行结果:

[('
test1
test2
', '
')]

③ 表达式 [sS]*

import re
data = "1
start
test1
test2
end
2"

reg4 = r"start([sS]*)end"
res = re.findall(reg4, data)
print(res)

执行结果:

['
test1
test2
']

④ 表达式 (?s)

import re
data = "1
start
test1
test2
end
2"

reg5 = r"(?s)start(.*)end"
res = re.findall(reg5, data)
print(res)
reg5 = r"(?s)start.*end"
res = re.findall(reg5, data)
print(res)

执行结果:

['
test1
test2
']
['start
test1
test2
end']

参考:

  1. https://stackoverflow.com/questions/159118/how-do-i-match-any-character-across-multiple-lines-in-a-regular-expression
--THE END--

免责声明:文章转载自《正则表达式实现跨行匹配》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python-项目骨架(powershell)双向广度优先搜索下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ThinkPHP3快速入门教程-:基础

一、ThinkPHP的认识: ThinkPHP是一个快速、简单的基于MVC和面向对象的轻量级PHP开发框架。 二、下载后的目录结构: ├─ThinkPHP.php框架入口文件 ├─Common框架公共文件 ├─Conf框架配置文件 ├─Extend框架扩展目录 ├─Lang核心语言包目录 ├─Lib核心类库目录 │├─Behavior核心行为类库 │├─C...

shell脚本-批量添加用户

批量添加用户,要求如下 脚本一:不是很严格但是很简洁的脚本 #!/bin/bash #该脚本用来实现批量添加用户。##作者阿鑫#日期2019/5/27#版本v1 #提示用户脚本使用方法 [ $# -eq 0 ] && echo "Usage useradd.sh number" &&exit #判断是否存在/data/u...

Day9.正则表达式、grep命令和sed命令

作业一:整理正则表达式 ^ 行首$ 行尾. 除了换行符以外的任意单个字符* 前导字符的零个或多个.* 所有字符[] 字符组内的任一字符[^] 对字符组内的每个字符取反(不匹配字符组内的每个字符)^[^] 非字符组内的字符开头的行 作业二:grep作业(正则表达式及字符处理) 目标文件/etc/passwd,使用grep命令或egrep1.显示出所有含有r...

vue之provide和inject

官方说: 当我们需要从父组件向子组件传递数据时,我们使用 props。想象一下这样的结构:有一些深度嵌套的组件,而深层的子组件只需要父组件的部分内容。在这种情况下,如果仍然将 prop 沿着组件链逐级传递下去 个人理解: 在祖先组件中定义provide(提供)给后代组件的数据或方法,在后代组件中可以通过inject(接受)提供的数据或方法 举个栗子, 想做...

[参考资料] 80个Python经典资料(教程+源码+工具)汇总

AD : 2018重磅地面课程《机器读心术之语音识别前沿实战特训营》,迈向人工智能新高度 【专题推荐】Python系列英文原版电子书 http://down.51cto.com/zt/104 python简明教程(CHM) http://down.51cto.com/data/49213 Linux黑客的python编程之道【pdf】推荐 http...

Vue生态圈之----Axios学习笔记

API 首先,我们把axios所有的【API】和【配置】及【返回内容】列一下: //通过配置发送请求 axios(config) axios(url[,config]) //别名 axios.request(config); axios.get(url[,config]); axios.delete(url[,config]); axios.head(u...