繁体   English   中英

如何使用python正则表达式返回在某种模式之前和之后出现的字符串列表?

[英]How to use python regular expressions to return a list of strings that comes before and after a certain pattern?

例如

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

问题在于它仅返回最后一项。

您需要使用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*

使用re.findall()返回所有匹配项的列表,并确保如果您的实际字符串中确实包含反斜杠,则将其加倍转义。 您可以删除前导/尾随.*因为无需找到这些子字符串,并在捕获组之前和之后使用\\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不会执行您要求的操作,因为它只会在目标字符串中找到模式的第一个匹配项。 您也不需要正则表达式核心的.*前后,因为(除非使用re.match ),模式可以匹配目标字符串中的任何位置 ,而不必全部匹配。

re.findall功能是您需要的功能。 无需返回MatchObject而是仅返回目标字符串中与模式匹配的所有子字符串的列表。 或者,如果模式中有任何组,它将返回与这些组匹配的子字符串,而不是整个模式所匹配的子字符串。

下面的代码允许在前后标记的内容前后留有可选的空格。 另外,如果您希望在单独的行上定义正则表达式,则也可以在那里进行编译。 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']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM