Python Regex查找两个单词之间的多个值

Python Regex查找两个单词之间的多个值,python,regex,Python,Regex,我试图检索两个单词之间的多个值,将文本的特定部分分隔开来。模式如下: (^\d\d\d\d)\D+ 我试过很多正则表达式,但没有成功 下面是一个不起作用的尝试示例,因为它只返回第一个值 Livro[\s\S]*?(^\d\d\d\d)\D+[\s\S]*(?=em moeda corrente) 我尝试应用正则表达式的文本如下。以粗体显示我要检索的值 更新 我更改了示例,因为有时前四位数字后面没有“/dd”。 分配证书编号:XXXXXXXX 6A 佩索阿雷西塔酒店 5588 39783 0

我试图检索两个单词之间的多个值,将文本的特定部分分隔开来。模式如下:

(^\d\d\d\d)\D+
我试过很多正则表达式,但没有成功

下面是一个不起作用的尝试示例,因为它只返回第一个值

Livro[\s\S]*?(^\d\d\d\d)\D+[\s\S]*(?=em moeda corrente)
我尝试应用正则表达式的文本如下。以粗体显示我要检索的值

更新 我更改了示例,因为有时前四位数字后面没有“/dd”。


分配证书编号:XXXXXXXX 6A

佩索阿雷西塔酒店

5588 39783 03-1SS可变电平

处分权法定委托人 03-阿蒂戈斯55、57、58、59、63、64、151 e 153,无子网站14.01 da Lista de Servicos e na Tabela 03,门切伊尔,达雷 第12/1994号补充协议,第56/1997号、第116/2000号补充协议, 196/2002、217/2003、270/2006、314/2008、320/2008、399/2011 e 502/2015、538/2017 e artigo 4°da Lei补充 第4124/2000号公告

利夫罗:14 Folha:17583a数据:18/04/2019-a 博士。--雷西塔-折纸咬法校长。科雷戈。“AcréscimoD.A Multa==dures.Total

201603==ISS变量36,806,472,164,3320,3370,09

201603 ISS变量116,00 20,38 6,82 13,64 62,74 219,58

201603 ISS变量340,0059,7419,9939,97179,88639,58

2016G3 ISS变量246,40 43,29 14,48 28,97 127,46 466,60

2016/10 O03国际空间站变量56,00 9,84 3,29 6,59 28,31 104,03

2016/11 03 ISS变量623,84 109,61 36,67 73,35 308,05 1.161 52

2016/12 03国际空间站变量20,40 3,58 4,20 2,40*9,83 37,41

总计,埃姆·莫达·科伦特,阿图利亚扎多:2020年6月23日2.682,81 A) Atuanizag&o Monetaria:artigos 153,第1段,200,| e 209,第12/94号托多斯达雷市政区;artigo 4号,达雷市政区 1124/2000


我在这里测试(更新了)


提前感谢;-)

我认为您要查找的完整模式是年/月,其中年为四位数,月为1或2位数,不多,因此后跟[space]。正则表达式形式:

import re

found = re.findall(r'(\d\d\d\d)/\d\d? ', text)
print(found)
产出:

['2016', '2016', '2016', '2016', '2016', '2016', '2016']
2016/6 03 = =ISS VARIAVEL 36,80 6,47 2,16 4,33 20,33 70,09
2016/7 03 ISS VARIAVEL 116,00 20,38 6,82 13,64 62,74 219,58
2016/8 03 ISS VARIAVEL 340,00 59,74 19,99 39,97 179,88 639,58
2016/9 G3 ISS VARIAVEL 246,40 43,29 14,48 28,97 127,46 466,60
2016/10 O03 ISS VARIAVEL 56,00 9,84 3,29 6,59 28,31 104,03
2016/11 03 ISS VARIAVEL 623,84 109,61 36,67 73,35 308,05 1.161 52
2016/12 03 ISS VARIAVEL 20,40 3,58 4,20 2,40 * 9,83 37,41
或者,如果需要表达式匹配的整行,只需省略括号:

found = re.findall(r'\d\d\d\d/\d\d? .*', text)
for line in found: print(line)
产出:

['2016', '2016', '2016', '2016', '2016', '2016', '2016']
2016/6 03 = =ISS VARIAVEL 36,80 6,47 2,16 4,33 20,33 70,09
2016/7 03 ISS VARIAVEL 116,00 20,38 6,82 13,64 62,74 219,58
2016/8 03 ISS VARIAVEL 340,00 59,74 19,99 39,97 179,88 639,58
2016/9 G3 ISS VARIAVEL 246,40 43,29 14,48 28,97 127,46 466,60
2016/10 O03 ISS VARIAVEL 56,00 9,84 3,29 6,59 28,31 104,03
2016/11 03 ISS VARIAVEL 623,84 109,61 36,67 73,35 308,05 1.161 52
2016/12 03 ISS VARIAVEL 20,40 3,58 4,20 2,40 * 9,83 37,41
或者用标记字符串(例如“Livro”)将文本一分为二,并在第二部分中紧跟换行符(行首)后搜索4位数字


您需要使用
re
模块的
findall()
方法。此外,我认为以下路径就是您正在寻找的路径:
'\n(\d+)\/(?=[\s\s]+em moeda corrente)


您可以在以下位置试用:

或者,您可以使用
\G
锚来获取捕获组1中的粗体值

(?:^Livro.*(?:\r?\n(?!\d{4}/\d).*)*\r?\n|\G)(\d{4})/\d+.*\r?\n(?=(?:\d{4}/\d.*\r?\n)*.*?\bem moeda corrente\b)
部分地

  • (?:
    非捕获组
    • ^Livro.*(:\r?\n(?!\d{4}/\d.*)*\r?\n
      匹配开始和不以4位和数字开头的行
    • |
    • \G
      在上一次匹配结束时断言位置
  • 关闭非捕获组
  • (\d{4})
    捕获组1,匹配4位数字
  • /\d+.\r?\n
    匹配
    /
    ,1+位后跟行的其余部分
  • (?=
    正向前瞻,断言右边的是
    • (?:\d{4}/\d.*\r?\n)*
      重复0+次匹配一行,以4位数字开始
    • *?\bem moeda corrente\b
      匹配包含
      em moeda corrente
  • 关闭正向前瞻
|

输出


本质上,这个
Livro[\s\s]*?^
regex永远不会匹配任何东西。您真正尝试过什么?您可以使用
(?:^Livro.*:\r?\n(?!\d{4}/\d.*)*)*\r?\n| \G)(?=(?:\d{4}/\d.\r?\n)*总计,em moeda corrente\b)(\d{4}/\d+\r\n
捕获行首的四位数字。感谢您的回答,但重要的是要在文本中提取模式的部分划界,因为我可以在文本的另一部分使用相同的模式。有什么建议吗?“Total em moeda corrente”最后,定界符就足够了吗?是的,作为最后的定界符可以。再次更新了这个问题的例子,因为有时字符串在四个第一个数字之后没有“/DD”。重要的是把“LIFRO”字符串作为第一个定界符。谢谢你的回答,但是重要的是要划定部分。我应该提取模式的文本,因为我可以在文本的另一部分使用相同的模式。我只想返回行开头的四位数字,因为有时我只有年份,而不是年份/月份。有什么建议吗?谢谢。对我来说真的不容易;-)@LucianoZanuz对于您更新的链接,您可以使用
(?:^Livro.*(:\r?\n(?!\d{4}[/]).*\r?\n |\G)(\d{4}[/]).\r?\n(?=(?:\d{4}[/].\r?\n)*.\bem moeda corrente\b)
Example code

import regex

pattern = r"(?:^Livro.*(?:\r?\n(?!\d{4}/\d).*)*\r?\n|\G)(\d{4})/\d+.*\r?\n(?=(?:\d{4}/\d.*\r?\n)*.*?\bem moeda corrente\b)"

print(regex.findall(pattern, s, regex.MULTILINE))
['2016', '2016', '2016', '2016', '2016', '2016', '2016']