Python 我会用什么样的正则表达式来匹配这个?

Python 我会用什么样的正则表达式来匹配这个?,python,regex,Python,Regex,我有几个字符串,如下所示: <some_text> TAG[<some_text>@11.22.33.44] <some_text> r = dict((m.group("tag"), m.group("ip")) for m in re.finditer('(?P<tag>\S+)\[.+?@(?P<ip>(?:\d{1,3}\.?){4})', line)) TAG[@11.22.33.44] 我想从此行中获取ip地址,并且只

我有几个字符串,如下所示:

<some_text> TAG[<some_text>@11.22.33.44] <some_text>
r = dict((m.group("tag"), m.group("ip")) for m in re.finditer('(?P<tag>\S+)\[.+?@(?P<ip>(?:\d{1,3}\.?){4})', line))
TAG[@11.22.33.44]
我想从此行中获取ip地址,并且只获取ip地址。(在本例中,假设ip地址的格式始终为xx.xx.xx.xx)

编辑:恐怕我不清楚

字符串将如下所示:

<some_text> TAG1[<some_text>@xx.xx.xx.xx] <some_text> TAG2[<some_text>@yy.yy.yy.yy] <some_text>
r = re.search('(?<=TAG.*@)(\d\d.\d\d.\d\d.\d\d)', line)
(?P<name>CONTENTS)
TAG1[@xx.xx.xx.xx]TAG2[@yy.yy.yy]
请注意,“some_text”可以是可变长度。我需要将不同的正则表达式与不同的标记相关联,以便在调用r.group()时返回ip地址。在上述情况下,正则表达式不会有什么不同,但这是一个坏例子

到目前为止,我尝试过的正则表达式还不够

理想情况下,我想要这样的东西:

<some_text> TAG1[<some_text>@xx.xx.xx.xx] <some_text> TAG2[<some_text>@yy.yy.yy.yy] <some_text>
r = re.search('(?<=TAG.*@)(\d\d.\d\d.\d\d.\d\d)', line)
(?P<name>CONTENTS)

r=re.search(”(?为什么要使用组或向后看?

re.search('TAG\[.@(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})\]')

为什么要使用组或看起来落后?
re.search('TAG\[.@(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})\]')

我认为这是不可能的-r.group()将始终返回匹配的整个字符串,因此您必须使用lookbehind,正如您所说,它必须是固定宽度的

相反,我建议修改您正在编写的脚本。我猜您有一大堆与之匹配的正则表达式,您不需要为每个正则表达式指定“this one uses r.group(0)”、“this one uses r.group(3)”等等

在这种情况下,可以使用Python的命名组功能:可以用正则表达式命名组,如下所示:

<some_text> TAG1[<some_text>@xx.xx.xx.xx] <some_text> TAG2[<some_text>@yy.yy.yy.yy] <some_text>
r = re.search('(?<=TAG.*@)(\d\d.\d\d.\d\d.\d\d)', line)
(?P<name>CONTENTS)
(?PCONTENTS)
然后检索与
r.group(“name”)
匹配的内容

我建议您在脚本中执行的操作是:匹配正则表达式,然后测试是否设置了
r.group(“usethis”)
。如果设置了,则使用它;如果未设置,则使用r.group()


这样,您可以通过在regexp中指定组名
usethis
来处理这种尴尬的情况,但是您的其他regexp不必知道或关心将始终返回匹配的整个字符串,因此您必须使用lookbehind,正如您所说的,lookbehind必须是固定宽度

相反,我建议修改您正在编写的脚本。我猜您有一大堆与之匹配的正则表达式,您不需要为每个正则表达式指定“this one uses r.group(0)”、“this one uses r.group(3)”等等

在这种情况下,可以使用Python的命名组功能:可以用正则表达式命名组,如下所示:

<some_text> TAG1[<some_text>@xx.xx.xx.xx] <some_text> TAG2[<some_text>@yy.yy.yy.yy] <some_text>
r = re.search('(?<=TAG.*@)(\d\d.\d\d.\d\d.\d\d)', line)
(?P<name>CONTENTS)
(?PCONTENTS)
然后检索与
r.group(“name”)
匹配的内容

我建议您在脚本中执行的操作是:匹配正则表达式,然后测试是否设置了
r.group(“usethis”)
。如果设置了,则使用它;如果未设置,则使用r.group()


这样,您就可以通过在regexp中指定组名
usethis
来处理这种尴尬的情况,但您的其他regexp不必知道或关心。

Try
re.search('(?Try
re.search('(?差不多,但我认为您需要在开始时将。*更改为.*?,因为您可能在一行上有多个标记(我相信-如示例中所示)


标签ID将位于第一个反向引用中,IP地址将位于第二个反向引用中,但我认为您需要将开始时的.*更改为。*?,因为您可能在一行上有多个标签(我相信-如示例中所示)



标记ID将在第一个反向引用中,IP地址将在第二个反向引用中

我认为问题不在于正则表达式,而在于您必须使用
r.group()
。可能更容易摆脱此要求;如果它导致此类问题,则很可能表明存在设计错误。我认为问题不在于正则表达式,而在于您必须使用
r.group()
。可能更容易摆脱此要求;如果它导致此类问题,则很可能表明存在设计错误。此正则表达式将返回整个部分:TAG[some]_text@xx.xx.xx.xx],当使用r.group()调用时。我需要它,因此r.group()仅返回ip_地址抱歉,在第一个\d之前忘记了左括号。我编辑了它,现在应该是正确的。这些不是
{1,3}
,而不是
{1-3}
?这仍然会返回整个标记[some]_text@xx.xx.xx.xx]这个正则表达式将返回整个节:TAG[some]_text@xx.xx.xx.xx],当用r.group()调用时。我需要它,因此r.group()只返回ip_地址抱歉,在第一个\d之前忘记了左括号。我编辑了它,现在应该是正确的。这些不应该是
{1,3}
,而不是
{1-3}
?这仍然会返回整个标记[some]_text@xx.xx.xx.xx]如果我没有弄错的话,请输入string。问题是string中多次出现@xx.xx.xx.xx。在这种情况下,您只需使用
re.findall(pattern)
我的歉意。我在这个问题上不够清楚。字符串看起来像这样:some_text TAG1[some]_text@xx.xx.xx.xx]一些文本标记2[一些_text@yy.yy.yy.yy]一些文本。我需要它来查找say just yy.yy.yy.yy。问题是字符串中多次出现@xx.xx.xx.xx。在这种情况下,您只需使用
re.findall(pattern)
我的道歉。我在这个问题上不够清楚。字符串看起来像这样:一些文本标记1[some]_text@xx.xx.xx.xx]一些文本标记2[一些_text@yy.yy.yy.yy]一些文本。我需要它来查找,比如说yy.yy.yy.yy。问题与您提到的完全一样。我不想指定此“标记”使用r.group(0),而另一个“标记”使用r.group(3)。我考虑过使用python的名称工具,从查看响应来看,这似乎是最好的选择