我想让我的正则表达式捕捉到:

monday mon thursday thu ...

所以可以这样写:
(?P<day>monday|mon|thursday|thu ...

但我想应该有一个更优雅的解决方案。

最佳答案

你可以写mon(day)?|tue(sday)?|wed(nesday)?,等等。
?是“零或一个重复”;所以它有点“可选”。
如果不需要所有后缀捕获,可以使用(?:___)非捕获组,因此:
mon(?:day)?|tue(?:sday)?|wed(?:nesday)?
如果您愿意,可以将星期一/星期五/星期日分组在一起:
(?:mon|fri|sun)(?:day)?
不过,我不确定这是否更有可读性。
工具书类
regular-expressions.info/RepetitionGrouping
另一种选择
Java的Matcher允许您测试是否存在部分匹配。如果Python也这样做了,那么您可以使用它来查看是否至少(或者可能完全)3个字符与monday|tuesday|....匹配(即所有完整的名称)。
下面是一个例子:

import java.util.regex.*;
public class PartialMatch {
   public static void main(String[] args) {
      String[] tests = {
         "sunday", "sundae", "su", "mon", "mondayyyy", "frida"
      };
      Pattern p = Pattern.compile("(?:sun|mon|tues|wednes|thurs|fri|satur)day");
      for (String test : tests) {
         Matcher m = p.matcher(test);
         System.out.printf("%s = %s%n", test,
            m.matches() ? "Exact match!" :
            m.hitEnd() ? "Partial match of " + test.length():
            "No match!"
         );
      }
   }
}

这张照片(as seen on ideone.com):
sunday = Exact match!
sundae = No match!
su = Partial match of 2
mon = Partial match of 3
mondayyyy = No match!
frida = Partial match of 5

相关问题
Can java.util.regex.Pattern do partial matches?
How can I perform a partial match with java.util.regex.*?

关于python - 日期名称或前3个字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3063818/

10-11 05:58