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

TIM*_*TIM 4 python regex

经过大量的搜索和阅读,我不能确定我想要做的是一步到位.我想要它匹配这个:

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

2011/12/13
Run Code Online (Sandbox Code Playgroud)

或这个

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

12/2011/13
Run Code Online (Sandbox Code Playgroud)

或这个

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

12/13/2011
Run Code Online (Sandbox Code Playgroud)

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


所以我做的就是将这三个包装成非捕获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}))$
Run Code Online (Sandbox Code Playgroud)

唯一的问题是如果在此使用它

2011/12/13
Run Code Online (Sandbox Code Playgroud)

我得到的是这个:

2100
10
10
Empty
Empty
Empty
Empty
Empty
Empty
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助是极大的赞赏.

谢谢 :)

Tot*_*oto 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+)$
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)