获取所有匹配的列表

我试图在一个大字符串中获取完整的颜色列表(以十六进制表示),如下所示:


'''

#C4F407      // valid color

#ZZZZZZ      // invalid color

Hello there! // invalid color

#F08         // invalid color

45E097       // invalid color

#FF00AA      // valid color

...

'''

所以我编写了这个正则表达式来查找它们: ^#([A-F]|[0-9]){6}$ ,它匹配只有一种颜色的字符串。(我的意思是re.search('^#([A-F]|[0-9]){6}$', '#C456F7'))匹配#C456F7)


但是,当我使用时, re.findall('^#([A-F]|[0-9]){6}$', largeString) 我得到了 [] 当我应该得到的时候['#C4F407', '#FF00AA']


我怎样才能获得所有写得好的颜色的列表?


郎朗坤
浏览 114回答 1
1回答

慕桂英546537

问题是您仅在字符串范围内搜索。^仅匹配行开头和$行结尾。由于您的字符串包含更多数据,^并且$不会匹配。将您的正则表达式更改为(#(?:[A-F]|[0-9]){6}),它将正常工作:>>> re.findall(r'(#(?:[A-F]|[0-9]){6})', largeString)['#C4F407', '#FF00AA']请注意,我?:在内括号中包含了 a,并且在外括号中包含了 a。这样,我们的正则表达式将不会捕获内括号内的内容,而只会捕获全颜色。另请注意,我使用了r''正则表达式字符串。它表明 python 解释器不应解释转义字符,例如\b和 将它们留给正则表达式。我建议在所有正则表达式字符串上使用它们。\b为了避免匹配超出第六个字符,您可以在正则表达式的末尾添加边框,例如(#(?:[A-F]|[0-9]){6})\b:>>> largeString = '''#C4F407      // valid color#ZZZZZZ      // invalid colorHello there! // invalid color#F08         // invalid color45E097       // invalid color#FF00AA      // valid color#0000000     // invalid color...'''>>> re.findall(r'(#(?:[A-F]|[0-9]){6})\b', largeString)['#C4F407', '#FF00AA']
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python