使用捕获组(python、regex)从字符串中捕获薪金

fivyi3re  于 2022-11-18  发布在  Python
关注(0)|答案(2)|浏览(165)

我的目标是从一个字符串中提取工资,如果这个工资来自集体协议,我想出了下面的正则表达式:

pattern = "([Kk]ollektivvertragliche[sn]|Kollektivvertrag|[Cc]ollective [Aa]greement|[Kk]ollektivvertr|KV) .* ([0-9]{1,4}[.,][0-9]{2,3}[,]*[0-9]*) .* ([0-9]{1,4}[.,][0-9]{2,3}[,]*[0-9]*)"
  • ([Kk]ollektivvertragliche[sn]|Kollektivvertrag|[Cc]ollective [Aa]greement|[Kk]ollektivvertr|KV)-第一个组,用于获取薪金是否根据集体协议定义。
  • ([0-9]{1,4}[.,][0-9]{2,3}[,]*[0-9]*)-薪金格式为xx.yyy,zz/xx.yyy,zz/x.yyy/xxx(例如21.950,13/1.859,20/1.700/700 $)
  • 集体协议和薪金之间的.+与任何字符匹配。

我已经测试过了,如果所有组都可用,它看起来工作得很好:

t = 'Entlohnung nach Caritas Kollektivvertrag : __ [lineBreak] Mindestgehalt in Gehaltsstufe 1 - Verwendungsgruppe VI , dzt. EUR 1.849,90 bis 1.900,32 '
r = re.search(pattern,t)
r.groups()

但是,如果某些组(例如集体协议或工资)被遗漏,它就不起作用。

string examples:
#t = 'EUR 35.362,00 Jahresbrutto'
#t = '2.800 brutto/Monat'
#t = 'laut Kollektivvertrag beträgt € 1.597,72 brutto pro Monat auf Basis Vollzeitbeschäftigung.'
#t = 'KV-Mindestgehalt von monatlich € 1.671,00'
#t = 'kollektivvertragliches Mindestgehalt von € 2.026,88 brutto pro Monat'
#t = 'Bruttojahreseinkommen ab € 50.000,'
#t = 'ein KV-Mindestlohn von EUR 1.277,00 brutto pro Monat'
#t = 'beträgt jedoch mindestens € 25.480'
#t = 'Gehalt lt. BAGS-KV €\xa02.100,78 brutto'
#t = 'kollektivvertraglicher Mindestgehalt EUR 33.000 Brutto/Jahr'
#t = '\nLohn/Gehalt ab EUR 2500,00 brutto monatlich,'
#t = 'KV IT __EUR 2.302'
#t = '25 Wochenstunden EUR [lineBreak] 1.641,91 bis EUR 1.859,21 brutto'
#t = 'Entlohnung nach Caritas Kollektivvertrag: __ [lineBreak] Mindestgehalt in Gehaltsstufe 1 - Verwendungsgruppe VI , dzt. EUR 1.849,90'
#t = 'The position is remunerated according to the Kollektivvertrag for Austrian Universities, i.e., the salary amounts to at least 38.230EUR/year before taxes'
#t = 'Erfahrung bieten wir ein Bruttojahresgehalt ab EUR 36.400.'

我试过在??:的帮助下实现可选组(就像在这篇文章中的python regex optional capture group),但也没有成功。

所需的输出:(组1结果、组2结果、组3结果)。

如果遗漏了某些组:我希望使用None而不是“group_n_result

0yycz8jy

0yycz8jy1#

不确定#t = '是否是您要包含在传回值中的字串的一部分,但使用3个撷取群组,其中前2个是选择性的:

^.*?(?:\b([Kk]ollektivvertragliche[sn]|Kollektivvertrag|[Cc]ollective [Aa]greement|[Kk]ollektivvertr|KV)\b(.*?))?([0-9]{1,4}([.,])\d{2,3}(?:(?!\4)[.,]\d+)?)

Regex demo

import re

pattern = r"^.*?(?:\b([Kk]ollektivvertragliche[sn]|Kollektivvertrag|[Cc]ollective [Aa]greement|[Kk]ollektivvertr|KV)\b(.*?))?([0-9]{1,4}([.,])\d{2,3}(?:(?!\4)[.,]\d+)?)"
s = ("#t = 'EUR 35.362,00 Jahresbrutto'\n"
     "#t = '2.800 brutto/Monat'\n"
     "#t = 'laut Kollektivvertrag beträgt € 1.597,72 brutto pro Monat auf Basis Vollzeitbeschäftigung.'\n"
     "#t = 'KV-Mindestgehalt von monatlich € 1.671,00'\n"
     "#t = 'kollektivvertragliches Mindestgehalt von € 2.026,88 brutto pro Monat'\n"
     "#t = 'Bruttojahreseinkommen ab € 50.000,'\n"
     "#t = 'ein KV-Mindestlohn von EUR 1.277,00 brutto pro Monat'\n"
     "#t = 'beträgt jedoch mindestens € 25.480'\n"
     "#t = 'Gehalt lt. BAGS-KV €\\xa02.100,78 brutto'\n"
     "#t = 'kollektivvertraglicher Mindestgehalt EUR 33.000 Brutto/Jahr'\n"
     "#t = '\\nLohn/Gehalt ab EUR 2500,00 brutto monatlich,'\n"
     "#t = 'KV IT __EUR 2.302'\n"
     "#t = '25 Wochenstunden EUR [lineBreak] 1.641,91 bis EUR 1.859,21 brutto'\n"
     "#t = 'Entlohnung nach Caritas Kollektivvertrag: __ [lineBreak] Mindestgehalt in Gehaltsstufe 1 - Verwendungsgruppe VI , dzt. EUR 1.849,90'\n"
     "#t = 'The position is remunerated according to the Kollektivvertrag for Austrian Universities, i.e., the salary amounts to at least 38.230EUR/year before taxes'\n"
     "#t = 'Erfahrung bieten wir ein Bruttojahresgehalt ab EUR 36.400.")
matches = re.finditer(pattern, s, re.MULTILINE)

for matchNum, m in enumerate(matches, start=1):
    print((m.group(1), m.group(2), m.group(3)))

输出量

(None, None, '35.362,00')
(None, None, '2.800')
('Kollektivvertrag', ' beträgt € ', '1.597,72')
('KV', '-Mindestgehalt von monatlich € ', '1.671,00')
('kollektivvertragliches', ' Mindestgehalt von € ', '2.026,88')
(None, None, '50.000')
('KV', '-Mindestlohn von EUR ', '1.277,00')
(None, None, '25.480')
('KV', ' €\\xa', '02.100,78')
(None, None, '33.000')
(None, None, '2500,00')
('KV', ' IT __EUR ', '2.302')
(None, None, '1.641,91')
('Kollektivvertrag', ': __ [lineBreak] Mindestgehalt in Gehaltsstufe 1 - Verwendungsgruppe VI , dzt. EUR ', '1.849,90')
('Kollektivvertrag', ' for Austrian Universities, i.e., the salary amounts to at least ', '38.230')
(None, None, '36.400')
ljsrvy3e

ljsrvy3e2#

要捕获几个匹配相同模式的组,似乎需要finditer。我能达到的最好效果是这样的(通过一些调整,你应该能够使它适合你的需要):

import re

pattern1 = re.compile("([Kk]ollektivvertragliche[snr]|Kollektivvertrag|[Cc]ollective [Aa]greement|[Kk]ollektivvertr|KV)")
pattern2 = re.compile("([0-9]{1,4}.[0-9]{2,3}[,[0-9]+]*)")

t = ''''Entlohnung nach Caritas Kollektivvertrag : __ [lineBreak] Mindestgehalt in Gehaltsstufe 1 - Verwendungsgruppe VI , dzt. EUR 1.849,90 bis 1.900,32 '
#t = 'EUR 35.362,00 Jahresbrutto'
#t = '2.800 brutto/Monat'
#t = 'laut Kollektivvertrag beträgt € 1.597,72 brutto pro Monat auf Basis Vollzeitbeschäftigung.'
#t = 'KV-Mindestgehalt von monatlich € 1.671,00'
#t = 'kollektivvertragliches Mindestgehalt von € 2.026,88 brutto pro Monat'
#t = 'Bruttojahreseinkommen ab € 50.000,'
#t = 'ein KV-Mindestlohn von EUR 1.277,00 brutto pro Monat'
#t = 'beträgt jedoch mindestens € 25.480'
#t = 'Gehalt lt. BAGS-KV €\xa02.100,78 brutto'
#t = 'kollektivvertraglicher Mindestgehalt EUR 33.000 Brutto/Jahr'
#t = '\nLohn/Gehalt ab EUR 2500,00 brutto monatlich,'
#t = 'KV IT __EUR 2.302'
#t = '25 Wochenstunden EUR [lineBreak] 1.641,91 bis EUR 1.859,21 brutto'
#t = 'Entlohnung nach Caritas Kollektivvertrag: __ [lineBreak] Mindestgehalt in Gehaltsstufe 1 - Verwendungsgruppe VI , dzt. EUR 1.849,90'
#t = 'The position is remunerated according to the Kollektivvertrag for Austrian Universities, i.e., the salary amounts to at least 38.230EUR/year before taxes'
#t = 'Erfahrung bieten wir ein Bruttojahresgehalt ab EUR 36.400.'
'''
for line in t.splitlines():
    found = []
    r = re.search(pattern1,line)
    found.append(r[0] if r else r)
    
    for match in pattern2.finditer(line):
        found.append(match[0])

    print(found)

# ['Kollektivvertrag', '1.849,90', '1.900,32']
# [None, '35.362,00']
# [None, '2.800']
# ['Kollektivvertrag', '1.597,72']
# ['KV', '1.671,00']
# ['kollektivvertragliches', '2.026,88']
# [None, '50.000,']
# ['KV', '1.277,00']
# [None, '25.480']
# ['KV', '2.100,78']
# ['kollektivvertraglicher', '33.000']
# [None] (this one comes from \n ; such empty lines can be filtered out)
# [None, '2500,00']
# ['KV', '2.302']
# [None, '1.641,91', '1.859,21']
# ['Kollektivvertrag', '1.849,90']
# ['Kollektivvertrag', '38.230']
# [None, '36.400']

相关问题