我有以下格式的字符串列表:
目标:
'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等的许多其他变体。我如何只抓住与给定单词完全匹配的行?
答案 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。
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']