我希望我的正则表达式能够抓住:
monday mon thursday thu ...
所以可以这样写:
(?P<day>monday|mon|thursday|thu ...
但我想应该有一个更优雅的解决方案。
答案 0 :(得分:3)
您可以撰写mon(day)?|tue(sday)?|wed(nesday)?
等
?
是“零或一次重复”;所以它有点“可选”。
如果您不需要所有后缀捕获,则可以使用(?:___)
非捕获组,因此:
mon(?:day)?|tue(?:sday)?|wed(?:nesday)?
如果您愿意,可以将星期一/星期五/星期日分组:
(?:mon|fri|sun)(?:day)?
我不确定这是否更具可读性。
Java Matcher
允许您测试是否存在部分匹配。如果Python也这样做,那么您可以使用它,看看monday|tuesday|....
上是否至少(或者可能确切地)匹配3个字符(即所有完整名称)。
以下是一个例子:
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!"
);
}
}
}
sunday = Exact match!
sundae = No match!
su = Partial match of 2
mon = Partial match of 3
mondayyyy = No match!
frida = Partial match of 5