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

Regex that doesnt match 0 at the beginning for every group

  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。帕西维克 30-03-2016 (1).xlsx
  5. 19 被动演绎 DEL 15-10-2016.xlsx (2)
  6. 23 被动演绎 DEL 15-12-2016.xlsx (1)
  7. 18 APORTE PASIVIC DEL 30-09-2016.xlsx

我想获取上面 文件名上打印的日期 但没有前导零。

我不想像上面那样获取整个日期,我想获取第一个文件 5-1-2016,第二个文件 15-1-2016,对于第三个 10-1-2016 等等(没有前导零) .

预期的输出应该是这样的:

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

我在 python 上做这个。

您可以使用 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']

您可以匹配 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 并在替换中使用捕获组:

</code></p> <pre><code>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"" result = re.sub(regex, subst, test_str, 1) if result: print (result) # 5-1-2016

Demo

以最原始的方式,我将采用此解决方案:

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