在一个python正则表达式中匹配两个模式,仅捕获非空值

时间:2011-12-13 14:35:52

标签: python regex

经过大量的搜索和阅读,我不确定我想要做的是一步到位。我希望它与之匹配:

(\d{1,4})/(\d{1,2})/(\d{1,2})

2011/12/13

或者

(\d{1,2})/(\d{1,4})/(\d{1,2})

12/2011/13

或者

(\d{1,2})/(\d{1,4})/(\d{1,2})

12/13/2011

在一个正则表达式中捕获括号中的值。


所以我所做的就是将这三个语句包装成非捕获or语句:

^(?:(\d{1,4})/(\d{1,2})/(\d{1,2}))|(?:(\d{1,2})/(\d{1,4})/(\d{1,2}))|(?:(\d{1,2})/(\d{1,2})/(\d{1,4}))$

唯一的问题是如果在此

上使用它
2011/12/13

我得到的是:

2100
10
10
Empty
Empty
Empty
Empty
Empty
Empty

我真的不喜欢空的捕捉。我可以设置它们,只返回非mpty字符串吗?!

我可以想到很多变通方法仍然可以完成这项工作,首先匹配正确的模式,然后匹配正确的捕获,检查捕获的值是否有多个空字符串,但在我看来这个应该可以在正则表达式本身。

非常感谢任何帮助。

谢谢:)

2 个答案:

答案 0 :(得分:5)

怎么样:

^(?:(?=\d{1,4}/\d{1,2}/\d{1,2})|(?=\d{1,2}/\d{1,4}/\d{1,2})|(?=\d{1,2}/\d{1,2}/\d{1,4}))(\d+)/(\d+)/(\d+)$

3向前看确保您有3种格式中的任何一种格式的日期,然后捕获日期的3个元素。

<强>解释

^                              : begining of the string
(?:                            : begin non capture group
  (?=\d{1,4}/\d{1,2}/\d{1,2})  : assume the format is yyyy/mm/dd
  |                            : or
  (?=\d{1,2}/\d{1,4}/\d{1,2})  : format dd/yyyy/mm
  |                            : or
  (?=\d{1,2}/\d{1,2}/\d{1,4})  : format dd/mm/yyyy
)                              : end of non capture group
(\d+)/(\d+)/(\d+)              : capture the 3 elements
$                              : end of string

答案 1 :(得分:1)

这是我的刺(短而甜):

(\d{2,4})(?=/)/(\d{2,4})(?=/)/(\d{2,4})$