加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营 > 正文

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

发布时间:2020-10-25 15:37:02 所属栏目:运营 来源:网络整理
导读:这篇文章首要先容了python中行使正则表达式将全部切合前提的字段所有提取出来,本文给各人先容的很是具体,对各人的进修或事变具有必然的参考小心代价,必要的朋

其后问了同事以及进一步相识了正则的运行机制后,发明小括号()除了提取匹配的字符串,尚有一个浸染是用来捕捉分组的,也就是说小括号中的内容匹配后会被存储起来,在挪用的时辰便会返回响应的值。而行使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 正则表达式提取字段内容请搜刮剧本之家早年的文章或继承赏识下面的相干文章但愿各人往后多多支持剧本之家!

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读