获取所有匹配项的列表

2024-09-28 19:34:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个大字符串中获得完整的颜色列表(六边形),如下所示:

'''
#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']

我怎样才能得到一份所有写得好的颜色的列表


Tags: 字符串rehello列表颜色colortherevalid
2条回答

问题是您只在字符串边界上搜索^只匹配行开始和$行结束

由于字符串包含更多数据,^$将不匹配

将正则表达式更改为(#(?:[A-F]|[0-9]){6}),它将正常工作:

>>> re.findall(r'(#(?:[A-F]|[0-9]){6})', largeString)
['#C4F407', '#FF00AA']

注意,我在内括号中包含了一个?:,在外括号中包含了一个。这样,我们正则表达式将不会捕获内括号中的内容,而只捕获全色

还要注意,我对正则表达式字符串使用了r''。它表示python解释器不应该解释转义字符,例如\b,而将它们留给正则表达式。我建议在所有正则表达式字符串上使用它们

为了避免超过第六个字符的匹配,可以在正则表达式的末尾添加一个边框\b,例如(#(?:[A-F]|[0-9]){6})\b

>>> largeString = '''
#C4F407      // valid color
#ZZZZZZ      // invalid color
Hello there! // invalid color
#F08         // invalid color
45E097       // invalid color
#FF00AA      // valid color
#0000000     // invalid color
...
'''
>>> re.findall(r'(#(?:[A-F]|[0-9]){6})\b', largeString)
['#C4F407', '#FF00AA']

试试这个正则表达式

#([A-F]|[0-9]){6}

相关问题 更多 >