如何使用Python正则表达式返回一个字符串列表,在特定模式之前和之后的字符串?

2024-04-28 06:39:30 发布

您现在位置:Python中文网/ 问答频道 /正文

例如

s = "Before\=String TARGETA After\=String limbo nonsense Before\=String TARGETB After\=String ..... Before\=String TARGETC After\=String"

结果列表应为:

['TARGETA','TARGETB','TARGETC']

我试过了

regex = '.*Before\=String(.*?)After\=String.*'
matches = re.search(regex, val).groups()
>> (' TARGETC ',)

问题是它只返回最后一项。你知道吗


Tags: re列表searchstringvalregexgroupsmatches
3条回答

使用^{}返回所有匹配项的列表,如果实际字符串中确实包含反斜杠,请确保对其进行双转义。您可以删除前导/尾随.*,因为查找这些子字符串并在捕获组之前和之后使用\s*来消耗多余的空白是不必要的。你知道吗

>>> import re
>>> s = 'Before\=String TARGETA After\=String limbo nonsense Before\=String TARGETB After\=String ..... Before\=String TARGETC After\=String'
>>> re.findall(r'Before\\=String\s*(.*?)\s*After\\=String', s)
['TARGETA', 'TARGETB', 'TARGETC']

不清楚你的反斜杠是否真的在目标字符串中。如果它们是,并且需要匹配,那么您需要将它们成对地放入正则表达式中,因为一个简单的\=将只匹配等号。你知道吗

re.search不会按您的要求执行,因为它只会在目标字符串中找到模式的第一个出现处。您也不需要在regex的核心前后.*,因为(除非您使用re.match)模式可以匹配目标字符串中的任何地方,而不必全部匹配。你知道吗

re.findall函数就是您需要的函数。它不是返回MatchObject,而是简单地返回目标字符串中与模式匹配的所有子字符串的列表。或者,如果模式中有任何组,它将返回这些组匹配的子字符串,而不是整个模式匹配的子字符串。你知道吗

下面的代码允许在before和after标记的内容周围使用可选的空格。另外,如果您想在单独的一行中定义regex,那么您也可以在那里编译它。re.X标志值允许将不重要的空白添加到正则表达式中,以使其更具可读性。你知道吗

import re

val = "Before\=String TARGETA After\=String limbo nonsense Before\=String TARGETB After\=String ..... Before\=String TARGETC After\=String"

regex   = re.compile(r' Before\\=String \s* (.*?) \s* After\\=String ', flags=re.X)
matches = re.findall(regex, val)


print(matches)

输出

['TARGETA', 'TARGETB', 'TARGETC']

您需要使用re.findall()而不是re.search(),并从开始和结束处删除.*元素:

regex = r'Before\\=String(.*?)After\\=String'
matches = re.findall(regex, val)

演示:

>>> import re
>>> s = "Before\=String TARGETA After\=String limbo nonsense Before\=String TARGETB After\=String ..... Before\=String TARGETC After\=String"
>>> regex = r'Before\\=String(.*?)After\\=String'
>>> re.findall(regex, s)
[' TARGETA ', ' TARGETB ', ' TARGETC ']

请注意,这仍然包含空格;如果不想包含空格,请在(...)捕获组之前和之后添加\s*。你知道吗

相关问题 更多 >