【问题标题】:Regex that doesnt match 0 at the beginning for every group在每个组的开头不匹配 0 的正则表达式
【发布时间】:2018-08-11 17:51:42
【问题描述】:
- 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 演绎被动式 DEL 15-10-2016.xlsx (2)
- 23 演绎被动式 DEL 15-12-2016.xlsx (1)
- 18 APORTE PASIVIC DEL 30-09-2016.xlsx
我想获取上面文件名上打印的日期
但没有前导零。
我想获取第一个文件 5-1-2016,而不是像上面那样获取整个日期,第二个文件我想要 15-1- 2016,第三次 10-1-2016 以此类推(NO LEADING ZEROS)。
预期的输出应该是这样的:
- 5-1-2016
- 15-1-2016
- 2016 年 10 月 1 日
- 30-3-2016
- 15-10-2016
- 15-12-2016
- 30-9-2016
我在 python 上执行此操作。
【问题讨论】:
标签:
regex
regex-group
regex-greedy
【解决方案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】:
您可以使用re.findall 和re.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】:
我会以最原始的方式使用这个解决方案:
([1-9])([0-9])-([0-9]+)-([0-9]+)|([0-9])-([0-9] +)-([0-9]+)