Regex替换:如果没有匹配项,则返回空的none/空字符串

oknwwptz  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(132)

所以我想我知道一点regex,但似乎我发现了一个案例,我的知识是在它的结束。无论如何,我尝试了下面的Regex Replace function: in cases of no match, $1 returns full line instead of null,但主要的区别是,我不仅要用匹配替换输入,而且还要在匹配之间插入一些字符。简单地说,我想将输入标准化为某种模式。我想要匹配并捕获输入的特定部分但不是全部的正则表达式

^[\D]*(?P<from_day>(0?[1-9])|([12][0-9])|3[01])[\.\-\s,■]+(?P<from_month>(0?[1-9])|(1[0-2]))[\.\-\s,■]*(?P<until_day>(0?[1-9])|[12][0-9]|3[01])[\.\-\s,■]+(?P<until_month>(0?[1-9])|1[012])[\D]*$

替换字符串:

\g<from_day>.\g<from_month>-\g<until_day>.\g<until_month>

输入:

28.11 16.12
"13.01 23,09"
01.08.-31.12
"01.01,-51.12"
"01,01.-31,12."
01083112
1.02 - 4.3

电流输出:

28.11-16.12.-.
13.01-23.09.-.
01.08-31.12.-.
.-..-.
01.01-31.12.-.
.-..-.
1.02-4.3.-.

预期/期望:

28.11-16.12
13.01-23.09
01.08-31.12

01.01-31.12

1.02-4.3

https://regex101.com/r/M3arvW/1

daolsyd0

daolsyd01#

你应该把你的正则表达式改为:

^\D*(?P<from_day>[12]\d|3[01]|0?[1-9])[.\s,■-]+(?P<from_month>1[0-2]|0?[1-9])[.\s,■-]*(?P<until_day>[12]\d|3[01]|0?[1-9])[.\s,■-]+(?P<until_month>1[012]|0?[1-9]).*|.+

Updated RegEx Demo
这将处理所有问题,除非没有匹配。如果没有匹配,则应使用lambda函数re.sub替换为空字符串。

Python代码:

>>> import re
>>> arr = ['"01,01.-31,12."', '01083112', '1.02 - 4.3', '"01.01,-51.12"']
>>> rx = re.compile(r'^\D*(?P<from_day>[12]\d|3[01]|0?[1-9])[.\s,■-]+(?P<from_month>1[0-2]|0?[1-9])[.\s,■-]*(?P<until_day>[12]\d|3[01]|0?[1-9])[.\s,■-]+(?P<until_month>1[012]|0?[1-9]).*|.+')
>>> for i in arr: print (rx.sub(lambda m: m.group('from_day') + '.' + m.group('from_month') + '-' + m.group('until_day') + '.' + m.group('until_month') if m.group('from_day') else '', i))
...
01.01-31.12

1.02-4.3

相关问题