如何使用正则表达式匹配未知长度的连续大写字母



最终,我将尝试从与特定字符和数字模式匹配的文件路径中检索子字符串。但在这一点上,我只是想让我的模式匹配正确。问题是,我并不总是知道匹配字符串的部分中有多少字符。

例如,大致模式是:所有大写字母后面跟着下划线、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(。

你能仔细检查一下你的要求并重述一下吗?

最新更新