python中使用正则表达式将所有符合条件的字段全部提取出来_正则表达式

来源:脚本之家  责任编辑:小易  

python 根据正则表2113达式提取指5261定的内容正则表达式是极其强大的4102,利用正则表达式来提取想要的1653内容是很方便的事。 下面演示了在python里,通过正则表达式来提取符合要求的内容。实例代码:import re#   正则表达式是极其强大的,利用正则表达式来提取想要的内容是很方便的事。# 下面演示了在python里,通过正则表达式来提取符合要求的内容。有几个要注意# 的地方就是:# [1] 要用()将需要的内容包含起来# [2] 编号为0的group是整个符合正则表达式的内容,编号为1的是第一个(及对应# 的)包含的内容# @param regex: regular expression, use () to group the result# 正则表达式,用()将要提取的内容包含起来# @param content: # @param index: start from 1, depends on the \p regex's ()# 从1开始,可以通过数(来得到,其中0是全部匹配# @return: the first match of the \p regex# 只返回第一次匹配的内容def extractData(regex, content, index=1): r = '0' p = re.compile(regex) m = p.search(content) if m: r = m.group(index) return r regex = r'第(.*)场雪'content = '2002年的第一场雪'index = 1print extractData(regex, content, index)www.zgxue.com防采集请勿采集本网。

问题如标题,使用正则表达式匹配字段目前无非就三种,分别是:

替换掉不就行咯,像这样: re.sub(r'',' ',‘eng li aasdddeiiiiideeeeef ’) 或者: >>> ' '.join(re.split(r'','eng li aasdddeiiiiideeeeef')) ' eng li aas ddde iiiiideeeeef ' >>>

re.match()re.search()re.findall()

那是因为正则表达式r'a(.+?)b|wz's和sd的结果在第一捕获组中,而wz在第0捕获组中,所以你要不然把wz也用小括号括起来r'a(.+?)b|(wz)'这样分别取第一和第二捕获组的数据,要不然你用r'(?

简单介绍一下,re.match()与re.search()非常类似,主要区别就是前者是从目标字符串的开头匹配,而后者则要没有这个要求。而re.findall()则是可以返回匹配的所有结果。但是有时候re.findall()返回的结果和前面两个并不一样,我们来看下面一个例子:

替换掉就好了。 re.sub(r'',' ',‘eng li aasdddeiiiiideeeeef ’) 或者: >>> ' '.join(re.split(r'','eng li aasdddeiiiiideeeeef')) ' eng li aas ddde iiiiideeeeef ' >>>

对于句子:

s = '颜色分类:红色 尺码:M 主要颜色:橘色 尺寸:S 颜色分类:黄色 尺码:L' text = 'asdasdasasd 红色M 46546546' c = re.findall(':(\w+?) .*?:([A-Z])', s) for x in c: if text.find(''.join(x)) > -1: print(x)

起病以来,患者无腰背痛、颈痛,无咽痛、口腔溃疡,无光过敏、脱发,无口干、眼干,无肢端发作性青紫,无肢体乏力,无浮肿、泡沫尿,精神、食欲、睡眠欠佳,近1月大便干结,5-6天1次,无腹痛、黑便、便血,小便1-2小时1次,无尿痛、血尿。体重未见明显变化。

筛选两遍,第一遍以非贪婪模式找出所有匹配有中的字符串,第二遍剔除其中含有非法字符的匹配结果。 test_str = '有干燥剂中有干燥中有发明了XX技术中有发明了XX中'regex1 = r'有(.+?)中' #匹配所有'有中'之间的字符pre_match = re.findall

我想使用正则去匹配所有包含小便和尿相关的子句,目的就是将“无浮肿、泡沫尿”和“小便1-2小时1次,无尿痛、血尿。”识别出来并且将这些子句返回。

本来我想使用re.findall()去匹配:

import relines = [ "起病以来,患者无腰背痛、颈痛,无咽痛、口腔溃疡,无光过敏、脱发,无口干、眼干,无肢端发作性青紫,无肢体乏力,无浮肿、泡沫尿,精神、食欲、睡眠欠佳,近1月大便干结,5-6天1次,无腹痛、黑便、便血,小便1-2小时1次,无尿痛、血尿。体重未见明显变化。", ]for line in lines: pattern = "[,;,;。]+[^,;,;。]*((小便)|尿)+[^,;,;。]*[,;,;。]+" str = re.findall(pattern,line) print(str)

结果为:

[('尿', ''), ('小便', '小便')]

这里说明一下我使用的模式的意义,因为我是要匹配子句,所以一个子句的前后必然会有相应的符号,所以pattern前面和后面均添加了“[,;,;。]+”;“+”表示至少匹配一个。而后面的“[,;,;。]*”表示匹配0个或多个除标点符号“,;,;。”的任意字符,这里分别添加了中英文的逗号、分号和句号,“*”表示匹配0个或1个及以上。需要说明的是,这里我之所以使用“[,;,;。]”,是因为文本中可能包含很多其他的符号,像上例中出现的“-”;所以想要使用汉字、数字、特定符号来匹配的话可能会存在遗漏,而我的目的是只想要得到匹配的子句,所以使用“[^,;,;。]”会更通用一些。接下来就是“((小便)|尿)”意思是匹配含有“小便”或者含有“尿”的子串。

但是使用re.findall()所得到的结果并不是我想要的,于是我稍微换了一下匹配规则,将“((小便)|尿)+”换成了“[(小便)|尿]+”;为了验证匹配的适用性,我又添加了两个样本。总体如下:

import relines = [ "起病以来,患者无腰背痛、颈痛,无咽痛、口腔溃疡,无光过敏、脱发,无口干、眼干,无肢端发作性青紫,无肢体乏力,无浮肿、泡沫尿,精神、食欲、睡眠欠佳,近1月大便干结,5-6天1次,无腹痛、黑便、便血,小便1-2小时1次,无尿痛、血尿。体重未见明显变化。", "起病以来,睡眠、胃纳正常,小便正常,近4~5年来每天解大便3~4次,多为黄褐色成形软便,偶有解烂便,有排便不尽感,便血、解黑便,无消瘦。", "身材矮小,体重较同龄人轻。"]for line in lines: pattern = "[,;,;。]+[^,;,;。]*[(小便)尿]+[^,;,;。]*[,;,;。]+" str = re.findall(pattern,line) print(str)

结果为:

[',无浮肿、泡沫尿,', ',近1月大便干结,', ',无腹痛、黑便、便血,', ',无尿痛、血尿。']

[',小便正常,', ',多为黄褐色成形软便,', ',有排便不尽感,']

[]

倒是匹配出了子句,一则是“小便1-2小时1次,无尿痛、血尿”中的“小便1-2小时1次”没有匹配出来,二则是竟然连大便相关的“近1月大便干结”和“无腹痛、黑便、便血”都匹配出来了,看来“[(小便)尿]”的意思并不是匹配含有“小便”或者“尿”的子串;那“[(小便)尿]”的意思是不是匹配含有“小”、“便”、“尿”任意一个的子串呢?但是根据第三个含有“小”但是不含“便”与“尿”的样本可以看出,上述的想法依然不对。

再加上re.findall()没有匹配到的子串在原始文本中的开始和结束位置,所以我想要得到“小便1-2小时1次,无尿痛、血尿。”这种两个子句连在一起的情况也很难得到。

于是我转而使用另一个很常用的re.search()方法。

import relines = [ "起病以来,患者无腰背痛、颈痛,无咽痛、口腔溃疡,无光过敏、脱发,无口干、眼干,无肢端发作性青紫,无肢体乏力,无浮肿、泡沫尿,精神、食欲、睡眠欠佳,近1月大便干结,5-6天1次,无腹痛、黑便、便血,小便1-2小时1次,无尿痛、血尿。体重未见明显变化。",]for line in lines: pattern = "[,;,;。]+[^,;,;。]*((小便)|尿)+[^,;,;。]*[,;,;。]+" str = re.search(pattern, line) print(str.group())

结果为:

,无浮肿、泡沫尿,

可见,re.search()只匹配遇到的第一个满足条件的子串。

而如果将pattern中的“((小便)|尿)”修改为“[(小便)|尿]”(或者“[(小便)尿]”,意思是完全一样的,也试过)

得到的结果为:

,无浮肿、泡沫尿,

可见修改前后并没有任何变化,但是如果我将原始文本中的“无浮肿、泡沫尿”中的“尿”删除,则修改前的结果为:

,小便1-2小时1次,

修改后的结果为:

,近1月大便干结,

也就是说对于

pattern = "[,;,;。]+[^,;,;。]*[(小便)尿]+[^,;,;。]*[,;,;。]+"

无论是re.findall()还是re.search(),都能匹配到大便相关的子串;

而对于:

pattern = "[,;,;。]+[^,;,;。]*((小便)|尿)+[^,;,;。]*[,;,;。]+"

re.findall()和re.search()匹配的子串就有所区别了,前置匹配的结果是含有元组的列表:[(‘尿', ‘'), (‘小便', ‘小便')];而后者匹配到了我想要的子串:,无浮肿、泡沫尿,

后来问了同事以及进一步了解了正则的运行机制后,发现小括号()除了提取匹配的字符串,还有一个作用是用来捕获分组的,也就是说小括号中的内容匹配后会被存储起来,在调用的时候便会返回相应的值。而使用re.findall()时会将存储分组的值全部返回。

再举个例子会更加明白些,将上述pattern中的“((小便)|尿)”改为“((小便)|(尿))”,如:

pattern = "[,;,;。]+[^,;,;。]*((小便)|(尿))+[^,;,;。]*[,;,;。]+"

使用re.findall()输出的结果为:

[('尿', '', '尿'), ('小便', '小便', '')]

由上可知,“((小便)|(尿))”使用了三个“()”,于是便产生了三个分组,在最外围的第一个分组用于捕获“小便”或“尿”,原文中“小便”和“尿”都能匹配到,所以第一个位置两者都有;第二个分组是用来捕获“(小便)”的,所以第二个分组只存储“小便”;同理第三个分组用来捕获“(尿)”的,所以结果只存储了“尿”。

而我使用re.search()来输出分组结果:

for line in lines:

    pattern = "[,;,;。]+[^,;,;。]*((小便)|(尿))+[^,;,;。]*[,;,;。]+"

    str = re.search(pattern, line)

    print(str.group(0))

    print(str.group(1))

    print(str.group(2))

    print(str.group(3))

结果为:

,无浮肿、泡沫尿,

尿

None

尿

group(1)、group(2)、group(3)分别与(‘尿', ‘', ‘尿')中对应的分组结果相同。但是这里的group(0)(或者说group(),两个意思完全一样)却不是“(‘尿', ‘', ‘尿')”;这里作者水平有限,不是很清楚原因,也就是说,当调用group(0)的时候,pattern中的()的意义并不再是捕获分组了,而是回到了原始的提取匹配字符串的意思上来了。

为了解决

pattern = "[,;,;。]+[^,;,;。]*[(小便)尿]+[^,;,;。]*[,;,;。]+"

会匹配到不想要的含有“大便”字符串的问题,通过使用非捕获分组(?:)便可以达到目的。

pattern = "[,;,;。]?[^,;,;。]*(?:小便|尿)[^,;,;。]*[,;,;。]"

此时便是匹配“小便”或者“尿”了;结果为:

[',无浮肿、泡沫尿,', ',小便1-2小时1次,', '无尿痛、血尿。']

注意上述结果,由于“,小便1-2小时1次,”和“无尿痛、血尿。”是紧接着的,而逗号已经被分配给了前者,所以后者便没有了逗号,这看起了有点像字符串的切片,被切走了就没了,所以这里在pattern中的第一个“[,;,;。]”后面将“+”换成了“?”()意思的前面的字符出现0次或1次;当然更进一步可以优化为:

pattern = "[,;,;。]?[^,;,;。]*(?:小便|尿).*?[,;,;。]"

可以看到,将pattern中第二个“[^,;,;。]”变为“.?”

上述虽然将所有子句全部匹配并输出了,但是相邻的两个子句还是分开输出的,仍旧没有达到我们想要的预期。于是对上述代码进行了改进:

for line in lines: #pattern = "[,;,;。]+[^,;,;。]*[('小便')尿]+[^,;,;。]*[,;,;。]+" pattern = "[,;,;。]?[^,;,;。]*?(?:小便|尿).*?[,;,;。]" #pattern = "[,;,;。]?[^,;,;。]*(?:小便|尿)[^,;,;。]*[,;,;。]" str = re.findall(pattern,line) ls = [',',';','.',',',';','。'] for idx, text in enumerate(str): if text[0] not in ls: str[idx-1] += text str.remove(text) print(str)

结果为:

[',无浮肿、泡沫尿,', ',小便1-2小时1次,无尿痛、血尿。']

而如果使用re.search(),也是可以达到预期的,代码如下:

for line in lines: result = [] num = -1 while line: #pattern = re.compile(r"[,;,;。]+[^,;,;。]*((小便)|尿)+[^,;,;。]*[,;,;。]+") #str = pattern.search(line) pattern = r"[,;,;。]+[^,;,;。]*((小便)|尿)+[^,;,;。]*[,;,;。]+" str = re.search(pattern,line) if str == None: break tmp = str.group() if str.start() == 0: result[-1] += tmp[1:] else: result.append(tmp[1:]) #print(tmp) num = str.end() - 1 #print(num) line = line[num:] print(result)

结果为:

['无浮肿、泡沫尿,', '小便1-2小时1次,无尿痛、血尿。']

到此这篇关于python中使用正则表达式将所有符合条件的字段全部提取出来的文章就介绍到这了,更多相关python 正则表达式提取字段内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网! 您可能感兴趣的文章:Python正则表达式匹配字符串中的数字python使用正则表达式(Regular Expression)方法超详细python 正则表达式获取字符串中所有的日期和时间Python 实用技巧之正则表达式查找和替换文本的操作方法Python 正则表达式匹配数字及字符串中的纯数字Python使用正则表达式去除(过滤)HTML标签提取文字功能python字符串中匹配数字的正则表达式Python正则表达式匹配和提取IP地址

替换2113掉不就行咯,5261像这4102样:re.sub(r'<[A-Z]+>',' ',‘<SPAN><P>eng li aas<SS>ddde<AP>iiiiideeeeef<P>’)或者1653:>>> ' '.join(re.split(r'<[A-Z]+>','<SPAN><P>eng li aas<SS>ddde<AP>iiiiideeeeef<P>'))' eng li aas ddde iiiiideeeeef '>>>,替换掉就2113好了5261。re.sub(r'<[A-Z]+>',' ',‘<SPAN><P>eng li aas<SS>ddde<AP>iiiiideeeeef<P>’4102)或者:1653>>> ' '.join(re.split(r'<[A-Z]+>','<SPAN><P>eng liaas<SS>ddde<AP>iiiiideeeeef<P>'))'  eng li aas ddde iiiiideeeeef '>>>本回答被网友采纳,本回答被提问者采纳内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 正则表达式判断所填入号码的运营商js代码修改版
  • 计算一个字符串在另一字符串中出现的次数函数
  • 正则表达式处理图片地址、img标签的方法
  • 比较正宗的验证邮箱的正则表达式js代码详解
  • 正则表达式i修饰符(大小写不敏感)
  • js正则表达式 匹配两个特定字符间的内容示例
  • java使用正则表达式对注册页面进行验证功能实现
  • 精确查找php webshell木马 修正版
  • js正则解析url参数示例代码
  • jquery如何用正则表达式验证手机号、身份证号、中文名称
  • python正则表达式提取多个匹配内容
  • python怎么根据正则表达式提取指定的内容
  • 如何在python中使用正则表达式提取每行中需要的信息
  • python,如何用正则表达式提取字符串中多个""之间...
  • python正则表达式提取多个匹配内容
  • python 正则表达式同时提取多个字符内容
  • python正则表达式能提取多个匹配内容?
  • Python 正则表达式如何提取指定的内容?
  • python正则表达式提取某段信息后,如何去掉这些信...
  • Python中如何获取符合正则表达式的数量呢?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全javascriptasp.netphp编程ajax相关正则表达式asp编程jsp编程编程10000问css/htmlflex脚本加解密web2.0xml/rss网页编辑器相关技巧安全相关网页播放器其它综合dart首页python正则表达式匹配字符串中的数字python使用正则表达式(regular expression)方法超详细python 正则表达式获取字符串中所有的日期和时间python 实用技巧之正则表达式查找和替换文本的操作方法python 正则表达式匹配数字及字符串中的纯数字python使用正则表达式去除(过滤)html标签提取文字功能python字符串中匹配数字的正则表达式python正则表达式匹配和提取ip地址正则表达式判断所填入号码的运营商js代码修改版计算一个字符串在另一字符串中出现的次数函数正则表达式处理图片地址、img标签的方法比较正宗的验证邮箱的正则表达式js代码详解正则表达式i修饰符(大小写不敏感)js正则表达式 匹配两个特定字符间的内容示例java使用正则表达式对注册页面进行验证功能实现精确查找php webshell木马 修正版js正则解析url参数示例代码jquery如何用正则表达式验证手机号、身份证号、中文名称java 正则表达式详解正则表达式匹配任意字符(包括换比较正宗的验证邮箱的正则表达式最新手机号码、电话号码正则表达javascript 手机号码正则表达式验js利用正则配合replace替换指定字正则表达式匹配不包含某些字符串正则中需要转义的特殊字符小结js正则函数match、exec、test、s最全的常用正则表达式大全——包几个小例子教你如何实现正则表达式highli正则表达式——匹配规则介绍php正则表达式的逆向引用与子模式分析js正则匹配table tr正则表达式字面量在ecmascript5中的变化用正则提取全部的匹配结果的代码vbscript 的正则表达式 字符串匹配使用正则表达式验证登录页面输入是否符合ip 正则表达式验证javascript正则表达式解析url的技巧
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved