【问题标题】:How to use python regular expressions to return a list of strings that comes before and after a certain pattern?如何使用python正则表达式返回某个模式之前和之后的字符串列表?
【发布时间】:2014-09-14 00:29:00
【问题描述】:

例如

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

问题是它只返回最后一项。

【问题讨论】:

    标签: python regex string list


    【解决方案1】:

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

    【讨论】:

    • 你有import s 而不是re =)
    【解决方案2】:

    使用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']
    

    【讨论】:

      【解决方案3】:

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

      re.search 不会按照你的要求做,因为它只会在目标字符串中找到模式的 first 出现。您也不需要正则表达式核心的前后.*,因为(除非您使用re.match)模式可以匹配目标字符串中的 anywhere 而不必全部匹配。

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

      【讨论】:

        猜你喜欢
        • 2021-03-15
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 2017-01-24
        • 2018-04-24
        • 1970-01-01
        • 2018-11-30
        • 2018-11-09
        相关资源
        最近更新 更多