我想让我的正则表达式捕捉到:
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/Repetition和Grouping
另一种选择
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/