获取所有匹配列表

Get list of all matches

我正在尝试获取像这样的大字符串中的完整颜色列表(六进制):

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

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

试试这个正则表达式。

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

问题是您只在字符串范围内搜索。 ^ 仅匹配行开始和 $ 行结束。

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

将您的正则表达式更改为 (#(?:[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']