每个组开头的正则表达式不匹配0

时间:2018-08-11 17:51:43

标签: regex regex-group regex-greedy

  1. 01 Ded.PASIVIC 05-01-2016.xlsx
  2. 01 Ded.PASIVIC 15-01-2016.xlsx
  3. 01 Ded.PASIVIC 10-01-2016.xlsx
  4. 06 DED。 PASIVIC 30-03-2016(1).xlsx
  5. 19 DEDUCCION PASIVIC DEL 15-10-2016.xlsx(2)
  6. 23 DEDUCCION PASIVIC DEL 15-12-2016.xlsx(1)
  7. 18个APORTE PASIVIC DEL 30-09-2016.xlsx

我想获得打印在文件名称上的日期上方 但没有前导零。 enter image description here

我想获取第一个文件 5-1-2016 ,而不是像上面那样获取整个日期,而不是我想要的第二个文件 15-1-15 2016 ,第三次 2016年1月10日,依此类推(没有领先的僵尸)。

预期输出应如下所示:

  1. 5-1-2016
  2. 2016年1月15日
  3. 2016年10月1日
  4. 2016年3月30日
  5. 2016年10月15日
  6. 2016年12月15日
  7. 2016年9月30日

我正在 python 上执行此操作。

3 个答案:

答案 0 :(得分:1)

您可以使用re.findallre.sub分两步进行操作:

import re

data = """
01 Ded.PASIVIC 05-01-2016.xlsx 
01 Ded.PASIVIC 15-01-2016.xlsx 
01 Ded.PASIVIC 10-01-2016.xlsx 
06 DED. PASIVIC 30-03-2016 (1).xlsx 
19 DEDUCCION PASIVIC DEL 15-10-2016.xlsx (2) 
23 DEDUCCION PASIVIC DEL 15-12-2016.xlsx (1) 
18 APORTE PASIVIC DEL 30-09-2016.xlsx
"""

matches = re.findall('(?:[0-9]{2}-){2}[0-9]{4}',data)
print(re.sub('0(?=[0-9]-)','',str(matches)))

打印:

['5-1-2016', '15-1-2016', '10-1-2016', '30-3-2016', '15-10-2016', '15-12-2016', '30-9-2016']

答案 1 :(得分:1)

您可以匹配3个组,对于前2个组,匹配一个可选的零,然后捕获1或2次数字0?([0-9]{1,2}-),然后加上破折号。

您可以在开头和结尾处添加一个word boundary \b

^.*?\b0?([0-9]{1,2}-)0?([0-9]{1,2}-)([0-9]{4})\b.*$

然后,您可以使用sub,并在替换中使用捕获组:

\1\2\3

import re
regex = r"^.*?\b0?([0-9]{1,2}-)0?([0-9]{1,2}-)([0-9]{4})\b.*$"
test_str = "01 Ded.PASIVIC 05-01-2016.xlsx"
subst = r"\1\2\3"
result = re.sub(regex, subst, test_str, 1)

if result:
    print (result) # 5-1-2016

Demo

答案 2 :(得分:1)

在最原始的方式下,我会采用以下解决方案:

([[1-9])([0-9])-([0-9] +)-([0-9] +)|([0-9])-([0-9] +)-([0-9] +)