正则表达式可在两个单词之间找到多个值

时间:2020-07-07 21:28:42

标签: python regex

我正在尝试检索两个单词之间的多个值,以界定文本的特定部分。模式是这样的:

(^\d\d\d\d)\D+

我尝试了很多正则表达式,但没有成功。

下面是一个尝试失败的示例,因为它仅返回第一个值。

Livro[\s\S]*?(^\d\d\d\d)\D+[\s\S]*(?=em moeda corrente)

我尝试应用正则表达式的文本如下。我要检索的值以粗体显示。

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


CERTIDAO DE DIVIDA ATIVA Nr:XXXXXXXXX 6A

Inscrigao Pessoa Receita

5588 39783 03 -1SS VARIAVEL

Dispositivo Legal do负责人 03-Artigos 55,57,58,59,63,64,151 e 153,nosubiteém14.01 da Lista de Servicos e na Tabela 03,inciso Ill,da Lei 编号12/1994,补编dadas pelas Leis,编号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。

Livro:14 _ Folha:17583 a数据:18/04/201 9-a Doc .-- Receita -Origam doDébite校长。 Corregao。 “AcréscimoD.AMulta ==杜蕾斯。总计

2016 03 = = ISS VARIAVEL 36,80 6,47 2,16 4,33 20,33 70,09

2016 03 ISS VARIAVEL 116,00 20,38 6,82 13,64 62,74 219,58

2016 03 ISS VARIAVEL 340,00 59,74 19,99 39,97 179,88 639,58

2016 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

道达尔·埃默达·埃莫达·托塔尔合计:23/06/2020 2.682,81 A)Atualizag&o Monetaria:artigos 153,paragrafo 1°,200,| e 209,todos da Lei Complementar Municipal第12/94号; artigo 4°,达里郡立市政厅n° 1124/2000。


我正在这里https://regex101.com/r/tzgGVT/2更新

预先感谢;-)

3 个答案:

答案 0 :(得分:1)

或者,您可以使用\G锚点来使用regex PyPi module,以获取捕获组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
    • 的行
  • )积极回望

Regex demo | Python demo

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']

答案 1 :(得分:0)

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

import re

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

输出:

['2016', '2016', '2016', '2016', '2016', '2016', '2016']

或者,如果您希望表达式匹配的整行,则省略括号:

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

输出:

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位数字

parts = text.split('Livro')
found = re.findall(r'\n(\d\d\d\d)', parts[1])

答案 2 :(得分:0)

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

>>> re.findall('\n(\d+)\/(?=[\s\S]+ em moeda corrente)', text)
['2016', '2016', '2016', '2016', '2016', '2016', '2016']

在以下位置尝试:https://regex101.com/r/RoOB0t/2

相关问题