Python 返回所有匹配项的正则表达式

Python 返回所有匹配项的正则表达式,python,regex,regex-group,Python,Regex,Regex Group,我有如下文本- 020520202:40:02.445:假期津贴:21;假期津贴:22;nnn 我想用Python提取下面的代码- Vacation Allowance: 21 Vacation Allowance: 22 基本上,我想提取所有出现的“假期津贴:”和后面的数字值后缀为 我使用下面的正则表达式- (.*)(Vacation Allowance:)(.*);(.*) 下面是完整的Python代码- import re text = '02/05/2020 Vacation Al

我有如下文本-

020520202:40:02.445:假期津贴:21;假期津贴:22;nnn

我想用Python提取下面的代码-

Vacation Allowance: 21
Vacation Allowance: 22
基本上,我想提取所有出现的“假期津贴:”和后面的数字值后缀为

我使用下面的正则表达式-

(.*)(Vacation Allowance:)(.*);(.*)
下面是完整的Python代码-

import re

text = '02/05/2020 Vacation Allowance: 21; 02/05/2020 Vacation Allowance: 22; nnn'

pattern = re.compile(r'(.*)(Vacation Allowance:)(.*);(.*)')

for (a,b,c,d) in re.findall(pattern, text):
    print(b, " ", c)
这并不是所有事件都给出,而是仅给出最后一次事件。电流输出为-

Vacation Allowance: 22

您能评论一下我如何提取所有事件吗?

在Javascript中,它将是
'text'。匹配(/\b默认值:\d+/g)


在Javascript中,需要全局属性
g

,它应该是
'text'。匹配(/\b分配余量:\d+//g)


您需要全局属性
g

问题在于所使用的正则表达式。
(.*)
块接受的字符串比您意识到的要多-
*
被称为贪婪操作,它将在仍然匹配的情况下消耗尽可能多的字符串。这就是为什么您只看到一个输出

建议匹配类似
假期津贴:\s*\d+或类似

text = '02/05/2020 Vacation Allowance: 21; 02/05/2020 Vacation Allowance: 22; nnn'
m = re.findall('Vacation Allowance:\s*(\d*);', text, re.M)
print(m)

结果:
['21','22']

问题在于所使用的正则表达式。
(.*)
块接受的字符串比您意识到的要多-
*
被称为贪婪操作,它将在仍然匹配的情况下消耗尽可能多的字符串。这就是为什么您只看到一个输出

建议匹配类似
假期津贴:\s*\d+或类似

text = '02/05/2020 Vacation Allowance: 21; 02/05/2020 Vacation Allowance: 22; nnn'
m = re.findall('Vacation Allowance:\s*(\d*);', text, re.M)
print(m)


结果:
['21',22']

只需使用
\b薪酬津贴:\s*\d+您想用什么语言实现此功能?您使用的是什么语言/工具?来自:“由于正则表达式不是完全标准化的,因此带有此标记的所有问题还应包括一个指定适用编程语言或工具的标记。”我需要Python中的此标记。@anubhava-感谢您的评论。我试过你的建议,但没用。顺便说一句,我正在Python中尝试这个。我现在已经在原来的问题中澄清了这一点。只需使用
\b工资津贴:\s*\d+您想用什么语言实现此功能?您使用的是什么语言/工具?来自:“由于正则表达式不是完全标准化的,因此带有此标记的所有问题还应包括一个指定适用编程语言或工具的标记。”我需要Python中的此标记。@anubhava-感谢您的评论。我试过你的建议,但没用。顺便说一句,我正在Python中尝试这个。我在原来的问题中已经澄清了这一点,谢谢你的回答。这就是我在Python中使用您的建议的方式,但它不起作用。没有结果。导入重新文本='2020年5月2日0假期津贴:21;2020年5月2日假期津贴:22;nnn'pattern=re.compile(r'\bVacation余量:\d+/g')print(re.findall(pattern,text))噢,Python。它是Python中的
pattern=re.compile(r'\bVacation allowment:\d+)
,没有
/g
,正如您可以使用findall一样。谢谢塔诺斯。我已经转向使用字符串函数(而不是regexp),因为还有其他模式需要匹配,而且值并不总是数字。对于regexp,我不得不使用。*,正如@Petriborg所阐明的那样,这是一个贪婪的操作,正在引发问题。感谢您的回复。这就是我在Python中使用您的建议的方式,但它不起作用。没有结果。导入重新文本='2020年5月2日0假期津贴:21;2020年5月2日假期津贴:22;nnn'pattern=re.compile(r'\bVacation余量:\d+/g')print(re.findall(pattern,text))噢,Python。它是Python中的
pattern=re.compile(r'\bVacation allowment:\d+)
,没有
/g
,正如您可以使用findall一样。谢谢塔诺斯。我已经转向使用字符串函数(而不是regexp),因为还有其他模式需要匹配,而且值并不总是数字。对于regexp,我不得不使用。*,正如@Petriborg所阐明的,这是一个贪婪的操作,并且会引起问题。感谢Petriborg澄清(.*)是一个贪婪的操作。我已经转向使用字符串函数(而不是regexp),因为还有其他模式需要匹配,而且值并不总是数字。我将此标记为正确答案,因为它正确地突出了问题,并引导我寻找替代解决方案。感谢Petriborg澄清(*)是一个贪婪的操作。我已经转向使用字符串函数(而不是regexp),因为还有其他模式需要匹配,而且值并不总是数字。我将此标记为正确答案,因为它正确地突出了问题,并引导我寻找替代解决方案。