Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在python中查找字符串中的精确单词_Regex_Python 3.x - Fatal编程技术网

Regex 如何在python中查找字符串中的精确单词

Regex 如何在python中查找字符串中的精确单词,regex,python-3.x,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_

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

目标:

'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)

以及搜索或findall等的许多其他变体。我如何才能仅获取与给定单词完全匹配的行?

Wiktor在我发布此消息之前发表了评论(这并不奇怪),但在这种情况下,精确匹配的标记实际上是
TLS 1
后面的一个空格。单词边界不够具体,因为它也会拾取像
tls1.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)

Wiktor在我发布这篇文章之前发表了评论(这并不奇怪),但在本例中,精确匹配的标记实际上是
tls1
后面的空格。单词边界不够具体,因为它也会拾取像
tls1.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)

<>你可以考虑以下方法。

TLS
作为一个整体,单词前面应该有一个单词边界,这样这个部分就包含在您的模式中了

如果必须在
1
后面或字符串末尾有空格,则使用负前瞻
(?!\S)
r'\bTLS 1(?!\S)
更有效。当然,您也可以使用
r'\bTLS 1(?:\s |$)'
。看

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

r'\bTLS 1(?!\.?\d)'
这将匹配后面没有
+数字的
TLS 1
。看

:

输出:

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

<>你可以考虑以下方法。

TLS
作为一个整体,单词前面应该有一个单词边界,这样这个部分就包含在您的模式中了

如果必须在
1
后面或字符串末尾有空格,则使用负前瞻
(?!\S)
r'\bTLS 1(?!\S)
更有效。当然,您也可以使用
r'\bTLS 1(?:\s |$)'
。看

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

r'\bTLS 1(?!\.?\d)'
这将匹配后面没有
+数字的
TLS 1
。看

:

输出:

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

使用
r'\bTLS 1\s'
r'\bTLS 1(?!\s)
获得更通用的大小写,以匹配
TLS 1
,后跟空格或字符串结尾。或
\bTLS 1(?!\?\d)
仅在后面不跟数字或
+数字时匹配。使用
r'\bTLS 1\s'
r'\bTLS 1(?!\s)
更一般的大小写匹配
TLS 1
,后跟空格或字符串结尾。或
\bTLS 1(?!\.?\d)
仅在后面没有数字或
+数字时匹配。