我正在尝试用一个正则表达式匹配几种不同的文件名语法。换句话说,我试图以不同的顺序将文件名字符串与相同的字符匹配。问题是我不知道如何将“OR”串在一起 | 涉及团体的情况。
组语法:
- 产品名称由任意字母组成,任意数字带有可选的“-”、“_”或字符之间的空格。“-”、“_”或空格绝不会出现在产品名称的开头或结尾。
- PAF 或 PA 总是有一个前导“-”,后跟一个尾随“-”,然后是一个数字。
- 修订代码由“FG”、“RD”、“X”、“A”或“\d+”组成,除了最后一个直接跟在后面的数字之外,所有这些都是一个数字。
- 工作表编号是小写或大写(因此称为 re.IGNORECASE),前面有一个“-”空格或什么都没有,然后是“工作表”这个词,后面是“-”空格或什么都没有,然后是一个数字。
文件名遵循以下模式:
- (产品名称)-(PAF/PA-#) (Sheet #)-(Revision)
- (\w(?:\w*(?:-|\s|_)?\w+)*)(-PA(?:F|)-\d+)(?:(?:\s|-)表(?:\s|-)\d+)(-(?:FG|RD|X|A|)\d+)
- (产品名称)-(PAF/PA-#)-(修订版) (表#)
- (\w(?:\w*(?:-|\s|_)?\w+)*)(-PA(?:F|)-\d+)(?:(?:\s|-)表(?:\s|-)\d+)(-(?:FG|RD|X|A|)\d+)
- (产品名称)-(PAF/PA-#)-(修订版)
- (\w(?:\w*(?:-|\s|_)?\w+)*)(-PA(?:F|)-\d+)(-(?:FG|RD|X|A |)\d+)
- (产品名称)-(修订版)(表号)
- (\w(?:\w*(?:-|\s|_)?\w+)*)(-(?:FG|RD|X|A|)\d+)(?:(?:\s |-)工作表(?:\s|-)\d+)
- (产品名称)-(修订版)
- (\w(?:\w*(?:-|\s|_)?\w+)*)(-(?:FG|RD|X|A|)\d+)
PAF PA 是产品类型表示,Sheet # 是无用信息,FG#、RD#、X#、A# 或 # 都是产品版本。我需要产品名称、外延和修订都在他们自己的组中。
^(\w(?:\w*(?:-|\s|_)?\w+)*)
(?:
(-(?:FG|RD|X|A|)\d+)|
(-PA(?:F|)-\d+)(-(?:FG|RD|X|A|)\d+)|
(-PA(?:F|)-\d+)(?:(?:\s|-)sheet(?:\s|-)\d+)|
(-PA(?:F|)-\d+)(?:(?:\s|-)sheet(?:\s|-)\d+)(-(?:FG|RD|X|A|)\d+)
)
(?:.*)?$
我已经尝试了上面的正则表达式,但它不能正常工作。首先它返回的组太多,我只想要 3 个。
pattern = re.compile(r'''^(\w(?:\w*(?:-|\s|_)?\w+)*) # match any alphanumeric and dashes without leading or trailing dashes
(-PA(?:F|)-\d+) # match '-PAF-<number>' or '-PA-<number>'
(?:(?:\s|-|)?sheet(?:\s|-|)?\d+)? # match '?sheet?<number>' where ? can be <space> or '-'
(-(?:FG|RD|X|A|)\d+)? # match '-FG<number>', '-RD<number>', '-X<number>', '-A<number>' or <number>
(?:.*)?$''', flags=re.IGNORECASE|re.VERBOSE)
上述字符串应与正则表达式匹配。