最终,我将尝试从与特定字符和数字模式匹配的文件路径中检索子字符串。但在这一点上,我只是想让我的模式匹配正确。问题是,我并不总是知道匹配字符串的部分中有多少字符。
例如,大致模式是:所有大写字母后面跟着下划线、4位数字、下划线,然后是大小写字符和数字的混合。
文件路径/here/of/unknown/length/thiSISTHEPATTER_1111_Iwantomach/。。。。。。
到目前为止,我已经尝试了re.compile(r'b[A-Z]+_d{4}_[a-zA-Z][0-9]*')
的变体然而,这仍然捕捉到模式的大写部分穿插小写字符的情况。
下面是一个测试用例:
import re
file_path = [
"C:/Users/csadf/asfsf/Test",
"BEAVERHEAD_2020_thisisatestQL1",
"BEAVERHEAD_2020_thisisatest",
"BEAVeRHEAD_2020_thisisatest",
"C:/Users/csadf/asfsf/Test/BEAVERHEAD_2020_thisisaTest1",
"C:/Users/csadf/asfsf/Test/BEAVERHEAD_202_thisisaTest1",
"C:/Users/csadf/asfsf/Test/BEAVERHEAD_2020_thisisaTest1/data/dfjt/rth"]
projectname_pattern = re.compile(r'b[A-Z]+[a-z]{0}[A-Z]+_d{4}_[a-zA-Z][0-9]*')
for i in file_path:
if projectname_pattern.search(i):
print("Found a match: ",i)
else:
print("no match")
在这个例子中,我希望它返回:
no match
Found a match
Found a match
no match
Found a match
no match
Found a match
编辑:更正了测试用例中的一个拼写错误。此外,似乎我无意中回答了自己的问题。上面的正则表达式似乎有效。
测试输出显示您的正则表达式完全符合您所声明的模式:
no match: C:/Users/csadf/asfsf/Test
Found a match: BEAVERHEAD_2020_thisisatestQL1
Found a match: BEAVERHEAD_2020_thisisatest
no match: BEAVeRHEAD_2020_thisisatest
no match: C:/Users/csadf/asfsf/TestBEAVERHEAD_2020_thisisaTest1
no match: C:/Users/csadf/asfsf/Test/BEAVERHEAD_202_thisisaTest1
Found a match: C:/Users/csadf/asfsf/Test/BEAVERHEAD_2020_thisisaTest1/data/dfjt/rth
C:\Users/csdf/asfsf/TestBEAVERHEAD_20_thisisaTest1的大小写不匹配,因为在BEAVERHEAD之前没有单词边界(\b(。
你能仔细检查一下你的要求并重述一下吗?