如何在python中的字符串中找到确切的单词

时间:2018-07-16 11:47:19

标签: regex python-3.x

我有以下格式的字符串列表:

目标:

'TLS 1.2 x67 DHE-RSA-AES128-SHA256 DH 2048 AES128 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256'

'TLS 1 x67 DHE-RSA-AES128-SHA256 DH 2048 AES128 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256'

'TLS 1.1 x67 DHE-RSA-AES128-SHA256 DH 2048 AES128 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256'

我想知道一行中是否仅完全匹配“ TLS 1”(而不是TLS 1.1或TLS 1.2)。

我在类似的帖子中尝试了以下解决方案:

#returns all the lines including TLS 1.1, TLS 1.2 ...    
lines = []    
    for i in target:
        if re.match(r'\bTLS 1\b', i):
            lines.append(i)

也尝试过:

#returns nothing  
lines = []    
    for i in target:
        if re.match(r'^TLS 1$', i):
            lines.append(i)

以及search或findall等的许多其他变体。我如何只抓住与给定单词完全匹配的行?

2 个答案:

答案 0 :(得分:2)

Wiktor在我发布此内容之前发表了评论(不足为奇),但是在这种情况下,精确匹配的标记实际上是TLS 1之后的空格。单词边界不够明确,因为它还会拾取您不想要的诸如TLS 1.1之类的东西。因此,请尝试以下版本:

#returns all the lines including TLS 1.1, TLS 1.2 ...    
lines = []    
    for i in target:
        if re.match(r'\bTLS 1\s', i):
            lines.append(i)

如果TLS文本可能是一行中的最后一件事,那么我们可以尝试使用此文本:

re.match(r'\bTLS 1(?=(\s|$))', i)

答案 1 :(得分:2)

您可以考虑以下方法。

TLS作为一个完整的单词,应该在其前面有一个单词边界,以便在您的模式中覆盖该部分。

如果在1或字符串末尾必须有一个空格,则使用负前瞻(?!\S)r'\bTLS 1(?!\S)'会更有效。好吧,您也可以使用r'\bTLS 1(?:\s|$)'。参见this regex demo

如果您只想确保1使用后没有数字或小数部分

r'\bTLS 1(?!\.?\d)'

这将匹配没有TLS 1或后面没有. +数字的.。参见this regex demo

Python demo

import re
target = ['TLS 1.2 x67 DHE-RSA-AES128-SHA256 DH 2048 AES128 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256', 'TLS 1 x67 DHE-RSA-AES128-SHA256 DH 2048 AES128 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256', 
'TLS 1.1 x67 DHE-RSA-AES128-SHA256 DH 2048 AES128 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256']
lines=[]
for i in target:
    if re.match(r'\bTLS 1(?!\.?\d)', i):
        lines.append(i)
print(lines)

输出:

['TLS 1 x67 DHE-RSA-AES128-SHA256 DH 2048 AES128 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256']